我有以下语法:
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令牌,空格被清除了。
我是否可以跳过空格,但在评论结构中我想要空格。
我希望有人有解决方案吗?
答案 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;}
;