1

我正在使用 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;}
;

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

4

1 回答 1

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_DOCCLASSAST 内没有空格。如果要保留空格,则需要将规则放入词法分析器中:

DOCSTM : 'DOC' .* 'ENDDOC'; 

(你必须.*现在使用)

于 2012-05-24T15:29:42.387 回答