2012-06-21 3 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. –

Смежные вопросы