[英]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.