【问题标题】:Parsing comment with antlr用 antlr 解析评论
【发布时间】:2012-05-31 02:18:12
【问题描述】:

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

DOC
Free text here
ENDDOC

我尝试添加规则:

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

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

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

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

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

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

提前感谢您能给我的任何建议。

【问题讨论】:

  • 问题是什么?尝试用问号结束至少一个句子。
  • @ceving,虽然没有实际的问号,但很清楚 OP 想要做什么(至少,如果你对 ANTLR 有一点了解,那就很清楚了)。

标签: c parsing comments antlr


【解决方案1】:

.*(零个或多个标记,在解析器规则中!)相比,使用(~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'; 

(你现在必须使用.*

【讨论】:

  • 非常感谢,在 SO 上看到其他 antlr 问题,我怀疑你可能会很有用 :-)
猜你喜欢
  • 1970-01-01
  • 2020-06-30
  • 2019-05-01
  • 2011-08-08
  • 2012-07-12
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多