【整理】antlr中的各种语法:集合元素(Element Sets),标签元素(Element Labels),构造树操作符(Tree construction operators)

【背景】

关于antlr的语法,

虽然之前也找到些资料:

【整理】ANTLR v3的语法

【整理】antlr语法中的fragment

但是还是不够完整,不够全面。

后来是找到了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′;
DECIMAL_VALUE   :    DIGIT+;

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必须是一个单个的节点,而不是一个子树。


发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量