1

私は次の文法を持っています:

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 トークンが含まれているため、スペースは消去されました。空白をスキップすることはできますが、コメント構造内にスペースを入れたいです。

誰かが解決策を持っていることを願っていますか?

4

1 に答える 1

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;}
 ;
于 2012-06-21T07:13:43.687 に答える