2012-06-21 98 views
1

我有以下的语法查找评论:在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();} ; 

现在,我会得到betwenn的/**/评论。这工作正常。但空间被清理,因为WS令牌与Skip()调用。 我可以有任何东西跳过空格,但在评论结构中我想要空格。

我希望任何人有解决方案?

回答

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;} 
; 
+0

谢谢,这工作正常。 – user1469116

+0

不客气,@ user1469116。 –