在ANTLR Grammar中查找评论

时间:2012-06-21 06:57:40

标签: comments antlr

我有以下语法:

grammar bxk; 
options
{
    language=CSharp3;
}

// start rule
start
    : com=comment root EOF
    ;


root
    : ROOT_ID CT_ID END
    ;

comment returns [string comment]
    :  ((('/*' des=(~'*/')* '*/'))NEWLINE) {$comment=$des.text;}
    ;


CHAR    :  ('a'..'z'|'A'..'Z') ;
ROOT_ID :  'ROOT_'(CHAR | DIGIT | SPECIAL)+ ;
CT_ID   :  'ct_'(CHAR | DIGIT | SPECIAL)+ ;
DIGIT   :  '0'..'9';
SPECIAL :  '_' ;
END :  ';';
ASSIGN : '=';
STRING  :  CHAR (CHAR | DIGIT | SPECIAL)*;
WS      :  (' '|'\t' | '\n' | '\r' | '\u000C')+ {Skip();} ; 

现在,我将在/**/之间收到评论。这很好。但是由于带有Skip()调用的WS令牌,空格被清除了。 我是否可以跳过空格,但在评论结构中我想要空格。

我希望有人有解决方案吗?

1 个答案:

答案 0 :(得分:2)

不要使comment成为解析器规则。改为使其成为词法规则:

COMMENT
    :  '/*' .* '*/' // no need for a NEWLINE at the end
    ;

在您的解析器规则中,您可以执行以下操作:

p returns [string comment]
 : FOO COMMENT BAR {$comment = $COMMENT.text;} // or {$comment = $COMMENT.Text;}
 ;