最新消息:20210917 已从crifan.com换到crifan.org

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

ANTLR crifan 3207浏览 0评论

【背景】

关于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的部分的语法,整理如下:

语法语法试用范围解释示例
TParser或Tree Parser在当前输入位置,匹配符号T。
符号始终以大写字母开头。
ID  :    (‘a’..’z’|’A’..’Z’|’_’) (‘a’..’z’|’A’..’Z’|’0′..’9’|’_’)*;
TLexer调用Lexer的规则T。

DIGIT           :    ‘0’..’9′;
DECIMAL_VALUE   :    DIGIT+;

T[«args»]Lexer调用fragment的Lexer的规则T,传递的是一个参数列表。
不适用于非fragment类型的规则。
 
‘literal’任何语法均可(Lexer,Parser,Tree Parser)匹配当前输入位置的字符串。
所谓的字符串,就是一个普通的符号,包含了固定的字母的组合。
 
rParser或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)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
92 queries in 0.197 seconds, using 23.41MB memory