查看“Lexicon.md”的源代码
←
Lexicon.md
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{MARKDOWN}} # 语法词典 大多数程序员都熟悉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: <img src=images/nonascii.png width=100> 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](http://pragprog.com/book/tpantlr2/the-definitive-antlr-4-reference) 和第10章,[Attributes and Actions](http://pragprog.com/book/tpantlr2/the-definitive-antlr-4-reference)。 嵌入在lexer规则中的动作不会被任何解释或翻译成生成的lexer。 ## 关键字 以下是ANTLR语法中保留字的列表: ``` import, fragment, lexer, parser, grammar, returns, locals, throws, catch, finally, mode, options, tokens ``` 此外,尽管不是关键字,但不要将“rule”一词用作规则名称。 此外,不要将目标语言的任何关键字用作标记、标签或规则名称。 例如,规则 'if' 将导致生成一个名为 'if' 的函数。 这显然是不可能的。
返回至“
Lexicon.md
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
变体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息