翻译:原文
ANTLR的词典对大部分程序员来说都是很熟悉的,它根据C语言的语法以及派生出来的一些语法描述扩展。
注释
这里有单行、多行、javadoc-style注释:
/** This grammar is an example illustrating the three kinds
* of comments.
*/
grammar T;
/* a multi-line
comment
*/
/** This rule matches a declarator for my language */
decl : ID ; // match a variable name
javadoc的注释在解析的时候将被隐藏。它们仅用于语法和任何规则的开头.
Identifiers
token的名称总会以字母为首所以词法规则就像Java的Character.isUpperCase方法。解析器规则名总是以小写字符开头(这将失败于Character.isUpperCase).初始的字符将跟随大写或小写字母,数字和下划线。这里有一些简单的例子:
ID, LPAREN, RIGHT_CURLY // token names/rules
expr, simpleDeclarator, d2, header_file // rule names
类似Java,ANTLR接受Unicode字符在ANTLR的名字里:
为了支持unicode解释器和词法分析规则,ANTLR使用下列规则:
ID : a=NameStartChar NameChar*
{
if ( Character.isUpperCase(getText().charAt(0)) ) setType(TOKEN_REF);
else setType(RULE_REF);
}
;
规则NameChar识别有效的字符:
fragment
NameChar
: NameStartChar
| '0'..'9'
| '_'
| '\u00B7'
| '\u0300'..'\u036F'
| '\u203F'..'\u2040'
;
fragment
NameStartChar
: 'A'..'Z' | 'a'..'z'
| '\u00C0'..'\u00D6'
| '\u00D8'..'\u00F6'
| '\u00F8'..'\u02FF'
| '\u0370'..'\u037D'
| '\u037F'..'\u1FFF'
| '\u200C'..'\u200D'
| '\u2070'..'\u218F'
| '\u2C00'..'\u2FEF'
| '\u3001'..'\uD7FF'
| '\uF900'..'\uFDCF'
| '\uFDF0'..'\uFFFD'
;
规则 NameStartChar 是满足于标识符开始字符的字符列表(rule, token, or label name):这些或多或少满足了isJavaIdentifierPart 和 isJavaIdentifierStart在java的字符类里。确定使用-encoding项在ANTLR的工具如果你的语法是使用UTF-8格式化,所以ANTLR会读取相应的字符集属性。
Literals
ANTLR不能像大多数语言一样区分字符和字符串文字。所有长度为一个或多个字符的文字字符串都用单引号括起来,例如';','if','> ='和' '(指的是包含单引号字符的单字符字符串)。文字绝不包含正则表达式。
文字可以包含格式为' \ uXXXX'(对于最多'U + FFFF'的Unicode代码点)或'\ u {XXXXXX}'(对于所有Unicode代码点)的Unicode转义序列,其中'XXXX'是十六进制Unicode代码点值。
例如,'\ u00E8'是带有重音的法语字母:'è',而'\ u {1F4A9}'是著名的表情符号:'💩'。
ANTLR还理解通常的特殊转义序列:'\ n'(换行符),'\ r'(回车符),'\ t'(制表符),'\ b'(退格键)和' \ f'(换页)。您可以直接在文字中使用Unicode代码点,也可以使用Unicode转义序列:
grammar Foreign;
a : '外' ;
ANTLR生成的识别器假定包含所有Unicode字符的字符词汇表。运行时库假定的输入文件编码取决于目标语言。对于Java目标,运行时库假定文件位于UTF-8中。使用CharStreams中的工厂方法,可以指定其他编码。
Actions
动作是用目标语言编写的代码块。您可以在语法中的多个位置使用动作,但是语法始终相同:用花括号括起来的任意文本。如果字符串或注释中的结尾大写字母“}”或/ *} * /,则无需转义。如果小冰壶是平衡的,那么您也不需要逃脱}:{...}。否则,请使用反斜杠转义多余的curl:\ {或}。操作文本应符合语言选项所指定的目标语言。
嵌入式代码可以出现在:@header和@members命名为动作,解析器和词法分析器规则,异常捕获规范,解析器规则的属性部分(返回值,参数和局部变量)以及一些规则元素选项(当前谓词)。
ANTLR在内部动作中所做的唯一解释与语法属性有关。请参阅令牌属性和第10章,属性和操作。嵌入在词法分析器规则中的动作无需任何解释或转换为生成的词法分析器。
Keywords
这一是一系列预留的关键字在ANTLR语法里
import, fragment, lexer, parser, grammar, returns,
locals, throws, catch, finally, mode, options, tokens
另外,尽管它不是关键字,但是请勿将单词“ rule”用作规则名称。此外,请勿将目标语言的任何关键字用作标记,标签或规则名称。例如,rule if将导致生成一个名为if的函数。那显然不会编译。
网友评论