【背景】
关于antlr的语法,
虽然之前也找到些资料:
但是还是不够完整,不够全面。
后来是找到了antrl作者写的官方书籍:
【资料下载】ANTLR的最全的官方文档:The Definitive ANTLR Reference:v2,v3,v4版本都有下载
在书中,才找到一个比较全面的解释。
具体章节是:
ANTLR Reference -> ANTLR Grammars -> Rules
现整理如下:
antlr的各种语法的详细解释
1.关于集合sets部分的语法,官网的总结如下:
语法 | 语法试用范围 | 解释 |
‘x’..’y’ | Lexer | 匹配x到y范围内的内容,包含x和y; |
(A | B | . . . | C) | Parser或Tree Parser | 匹配此范围内的任何一个子规则(subrule)。 当不包含动作action,且每个可选项(A或B或C等),都是一个token,则这些subrule可以被展开为一个集合 (此点不太懂,待高手解释) |
(‘x’..’y’ |’a’ | . . . |’b’) | Lexer | 匹配任何一个集合内或单个的字符。 |
~x | 任何语法均可(Lexer,Parser,Tree Parser) | 匹配,非x的范围内的内容。 其中x可以为,单个元素(element),一个范围(range),一个子规则集合(subrule set) |
2.关于标签label的部分的语法,整理如下:
语法 | 语法试用范围 | 解释 | 示例 |
T | Parser或Tree Parser | 在当前输入位置,匹配符号T。 符号始终以大写字母开头。 | ID : (‘a’..’z’|’A’..’Z’|’_’) (‘a’..’z’|’A’..’Z’|’0′..’9’|’_’)*; |
T | Lexer | 调用Lexer的规则T。 | DIGIT : ‘0’..’9′; |
T[«args»] | Lexer | 调用fragment的Lexer的规则T,传递的是一个参数列表。 不适用于非fragment类型的规则。 | |
‘literal’ | 任何语法均可(Lexer,Parser,Tree Parser) | 匹配当前输入位置的字符串。 所谓的字符串,就是一个普通的符号,包含了固定的字母的组合。 | |
r | Parser或Tree Parser | 在当前输入位置,匹配规则r。 即,就像调用一个函数一样,调用此规则。 | |
r[«args»] | Parser或Tree Parser | 在当前输入位置,匹配规则r。 像函数调用一样,传入一个参数列表。 方括号内的参数的语法是,符合目标语言的语法,常常是一个以逗号为分隔符的参数列表。 | |
. | 任何语法均可(Lexer,Parser,Tree Parser) | 通配符。 匹配parser中的单个的符号(token); 匹配lexer中的单个字符(character); 匹配Tree Parser中单个子树(节点); | func : ^(FUNC ID args .) ; 匹配(不包括函数体的)函数定义; 通配符,在此处,是忽略掉了整个的子树,即函数体的部分。 |
{«action»} | 任何语法均可(Lexer,Parser,Tree Parser) | 当前面可选元素(alternative element)之后,下一个可选元素之前,执行对应的动作(action); 执行的动作的语法,是遵循目标语言的语法; 回溯(backtracking)的时候,不执行此动作; | |
{«p»}? | 任何语法均可(Lexer,Parser,Tree Parser) | (在解析阶段进行)语法评估和预测; 如果评估失败,则会抛出PredicateException; 评估所用语法遵循目标语言的语法; 当需要符号表(Symbol table)信息,来消除语法中多个可选项的歧义时,此预测功能,就显得极为重要,很有价值了。 |
特别说明:
- ANTLR在为规则members产生对应的代码时,会生成对应的members_return;
3.对于规则元素的构造数的操作符方面的语法
语法 | 语法试用范围 | 解释 |
T! | Parser | 匹配符号T,但是在为此规则所生成的树节点中,不存在,即生成的树中,不包含此节点; |
r! | Parser | 调用规则r,但是在(为此规则所)生成的树中,不包括其子树(subtree) |
T^ | Parser | 匹配符号T,且(用Parser的树适配器(tree adapter))产生一个AST节点,且不管此T是不是在一个子规则(subrule)中或是最外层,都将此节点,作为此封闭的规则的树的根节点。 |
r^ | Parser | 调用规则r,使其返回的AST节点成为此封闭规则的树的根节点,而不管此规则是在一个子规则中或是最外层。规则r必须是一个单个的节点,而不是一个子树。 |
转载请注明:在路上 » 【整理】antlr中的各种语法:集合元素(Element Sets),标签元素(Element Labels),构造树操作符(Tree construction operators)