Grammar
语法词典
注释
Single Line
// -
Multi Line
/**
*
*/命名
Token以大写字母开头,解析规则以小写开头。首字符后,可以是大小写字母、数字、下划线。
ID, LPAREN, RIGHT_CURLY // token names/rules
expr, simpleDeclarator, d2, header_file // rule names支持Unicode编码字符,比如中文文字。
常量
ANTLR不区分字符和字符串,所有的字符串常量,都使用单引号包裹,常量字符串中不包含正则表达式。常量字符串支持
Actions
Actions是用目标语言编写的代码块。可以在一个语法中多次使用action,格式为大括号包围的任意文本。字符串和注释中的大括号无须转义。如果左右大括号能够平衡匹配,也无须对大括号进行转义。
Actions可以出现在:以@header 和 @members命名的action中、解析和语法规则中、exception catching specifications, attribute sections for parser rules (return values, arguments, and locals) and some rule element options (currently predicates)。
Keywords
ANTLR保留字如下。
尽量不要使用rule作为关键字,此外应当排除目标语言的关键字。
语法结构
语法本质上是一个语法声明,后跟规则列表,具有以下一般形式。
语法 X 必须定义在以 X.g4 命名的文件内。可以以任意顺序定义 options、imports、 token specifications、actions。options、imports、 token specifications 最多可定义一次,除了Header和至少一个规则,其他都是可选的。规则基本格式如下。
解析器规则(parser)名称必须以小写字母开头,而词法分析器(lexer)规则必须以大写字母开头。
定义grammar时如果grammar头部没有前缀,那么可以定义 词法分析器 和 解析器规则 规则。
只有语法分析器可以包含mode、自定义channels。
这些channels可以像枚举一样在语法分析器中使用。
Imports
ANTLR 支持导入其他文件,放在主文件的最后,因此导入文件定义不会覆盖主文件定义内容。
Tokens
Tokens 是用于定于grammar需要的token类型,和语法分析器规则无关。
通常情况下,tokens部分定义用于grammar中actions需要使用的token类型。
Tokens 只是定义一组tokens,添加到全局的集合中。
语法级别的Actions
现在,只有两个action定义用于语法规则之外,header和members。
对于组合语法,可以使用@parser::name 或者 @lexer::name 限制action应用在parser还是lexer。
解析器规则
解析器包含一系列的解析器规则,可以定义在解析器语法或者组合语法中。Java程序通过调用ANTLR生成的规则函数,执行解析器。最基本的规则可以是一个规则名,紧跟单个选项,并以分号结尾。
规则可以有多个选项,并以|结尾。
选项可以是一系列的规则元素,或者为空。空选项可以让整个规则为可选。
Alternative Labels
使用 # 可为选项打标签,ANTLR会生成对用的监听器,可以更细粒度地监听解析树事件。要么所有的选项都有标签,要么都没有。
ANTLR生成如下监听器。
可以在多个选项使用相同的标签。
对应生成的监听器如下。
规则上下文对象
ANTLR生成可以访问和每个规则相关的上下文对象。对于只有一个引用的规则,ANTLR生成一个没有参数的方法。
ANTLR生成如下Context对象。
ANTLR也支持多个引用的规则的上下文对象。
生成的Context对象如下。
如果另外一个规则,s,引用了 field,嵌套的action可以访问field匹配的规则e的列表。
规则元素标签
可以使用=符号来为规则元素设置标签,以向规则上下文对象中添加字段。
这里的value是定义在其他位置的规则e的返回值的标签。便签编程对应解析树节点的字段。在这个实例中,value是 Return 选项的标签,因此value标签成为了ReturnContext的字段。
使用 += (标签列表)符号可以方便地跟踪多个token。比如,下面的创建了一个Token对象列表,来匹配简单的数组构造方法。
ANTLR在对应的规则上下文类中生成对应的列表字段。
这种标签列表同样适用于引用。
ANTLR生成一个字段,来保存上下文对象列表。
规则元素
规则元素指定解析器在给定时刻应执行的操作,就像编程语言中的语句一样。这些元素可以是rule、token、string literal,比如表达式、ID、'return'。下面是规则元素的完整列表。
语法
描述
T
匹配当前输入位置的token T,Tokens总是以大写字母开头。
'literal'
在当前输入位置,匹配字符常量,字符串文字只是带有固定字符串的标记。
r
在当前输入位置匹配规则r,相当于函数调用一样触发该规则。解析规则名总是以小写字母开头。
r [«args»]
当前输入位置匹配规则r,并像函数调用一样传入参数列表。中括号里面的参数,使用目标语言语法。
{«action»}
在前一个选项元素之后和后一个选项元素之前立即执行action。该action符合目标语言语法。ANTLR逐字复制这些action代码至生产的类中,除了属性占位符和token引用,比如 $x,$x.y。
{«p»}?
判断语义断言«p»。
.
匹配任意单个Token,EOF除外。点操作被成为通配符。
当需要匹配一个或者多个token之外的任意内容是,可以使用 ~ 操作符。这个操作符很少在解析器中使用,但是可用。~INT 匹配除了INT之外的任意Token。~',' 匹配除了逗号的任意token。~(INT|ID) 匹配除了INT和ID的任意Token。
Token, string literal, semantic predicate rule elements 可以带选项。
最后更新于
这有帮助吗?