繁体   English   中英

用antlr解析评论

[英]Parsing comment with antlr

我正在使用ANTLR来解析自定义数据定义语言。 我正在使用C作为语言,并且正在输出抽象语法树。 到目前为止一切顺利,但是现在我需要添加文档,并且需要允许以下形式的块:

DOC
Free text here
ENDDOC

我尝试添加一条规则:

docstm  :   'DOC' ContentDoc=(.*) 'ENDDOC' -> ^(T_DOCCLASS $ContentDoc); 

其中T_DOCCLASS是在tokens {...}部分中定义的虚拟标记。 不幸的是,虽然DOC ... ENDDOC块的解析不会失败,但是树只有T_DOCCLASS没有任何子节点。

其他其他信息:我正在使用ANTLR 3.2和以下前奏:

options {   
output   = AST;
language = C;
ASTLabelType = pANTLR3_BASE_TREE;
}

而且我还有另一个跳过空格的规则:

WS  :   ( ' '
    | '\t'
    | '\r'
    | '\n'
    ) {$channel=HIDDEN;}
;

预先感谢您可以给我的任何建议。

代替.* (解析器规则中的零个或多个令牌!),它更安全(~ENDDOC)* (除ENDDOC之外的零个或多个令牌):

docstm      : DOC innerDocstm ENDDOC -> ^(T_DOCCLASS innerDocstm); 
innerDocstm : (~ENDDOC)*;
DOC         : 'DOC';
ENDDOC      : 'ENDDOC';
ID          : ('a'..'z' | 'A'..'Z')+;
WS          : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;};

导致:

在此处输入图片说明

如您所见, T_DOCCLASS AST中没有空格。 如果要保留空间,则需要将规则放在词法分析器中:

DOCSTM : 'DOC' .* 'ENDDOC'; 

(您现在必须使用.*

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM