Lexicon.md
语法词典
大多数程序员都熟悉ANTLR的词汇,因为它遵循C及其派生词的语法,并对语法描述进行了一些扩展。
注释
有单行、多行、Javadoc风格的注释:
/** 这个语法就是一个例子,说明了这三种语法
* 注释。
*/
grammar T;
/* a multi-line
comment
*/
/** 此规则与我的语言的声明符匹配 */
decl : ID ; // 匹配变量名
Javadoc注释对解析器隐藏,目前被忽略。 它们仅打算在语法和任何规则开始时使用。
标识符
Token名称总是以大写字母开头,Java的Character.isUpperCase
方法定义的词法分析器规则也是如此。 解析器规则名称总是以小写字母开头 (那些未通过 'Character.isUpperCase' 的名称)。 首字母后面可以是大小写字母、数字和下划线。 以下是一些示例名称:
ID, LPAREN, RIGHT_CURLY // token names/lexer rules
expr, simpleDeclarator, d2, header_file // parser rule names
Like Java, ANTLR accepts Unicode characters in ANTLR names:
To support Unicode parser and lexer rule names, ANTLR uses the following rule:
ID : a=NameStartChar NameChar*
{
if ( Character.isUpperCase(getText().charAt(0)) ) setType(TOKEN_REF);
else setType(RULE_REF);
}
;
Rule “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'是可以启动标识符(规则、令牌或标签名)的字符列表:
这些或多或少对应于Java的Character类中的isJavaIdentifierPart
和isJavaIdentifierStart
。 如果语法文件不是UTF-8格式,请确保在ANTLR工具上使用 “-encoding” 选项,以便ANTLR正确读取字符。
字面文本
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是用目标语言编写的代码块。 您可以在语法中的许多位置使用动作,但是语法始终是相同的:用大括号括起来的任意文本。 如果它在字符串或注释中,则不需要转义结束的卷曲字符: '“}” 或'/}/'。 如果卷发是平衡的,你也不需要逃避:“{…}”。 否则,用反斜杠转义多余的卷曲:\{
或\}
。 操作文本应符合语言选项中指定的目标语言。
嵌入式代码可以出现在:“@header”和“@members”命名操作、解析器和lexer规则、异常捕获规范、解析器规则的属性部分(返回值、参数和局部变量),以及一些规则元素选项(当前为谓词)。
ANTLR在动作内部所做的唯一解释与语法属性有关; 请参阅 Token Attributes 和第10章,Attributes and Actions。 嵌入在lexer规则中的动作不会被任何解释或翻译成生成的lexer。
关键字
以下是ANTLR语法中保留字的列表:
import, fragment, lexer, parser, grammar, returns,
locals, throws, catch, finally, mode, options, tokens
此外,尽管不是关键字,但不要将“rule”一词用作规则名称。 此外,不要将目标语言的任何关键字用作标记、标签或规则名称。 例如,规则 'if' 将导致生成一个名为 'if' 的函数。 这显然是不可能的。