2014-10-20 5 views
0

Извините, если какая-либо терминология отключена, только что начал использовать antlr в последнее время.ANTLR3 не игнорирует комментарии, начинающиеся с первого символа файла

Вот грамматика ANTLR, которая игнорирует многострочные комментарии:

COMMENT  : '/*' .* '*/'; 
SPACE  : (' ' | '\t' | '\r' | '\n' | COMMENT)+ {$channel = HIDDEN;} ; 

Вот комментарий, начиная с первым символом файла, который я хотел бы скомпилировать:

/* 
    This is a comment 
*/ 

Вот ошибка Я получаю:

[filename] line 252:0 no viable alternative at character '<EOF>' 
[filename] line 1:1 no viable alternative at input '*' 

Однако, если я поставить пробел перед комментарием, например, так:

/* 
    This is a comment 
*/ 

Он компилируется в порядке. Есть идеи?

+0

Нам нужна полная грамматика, чтобы узнать, что случилось. Кроме того, правило комментариев правило не является жадным, чтобы избежать потребления всех данных между двумя многострочными комментариями. –

ответ

0

Для игнорирования Multilines комментарии:

ML_COMMENT 
    : '/*' (options {greedy=false;} : .)* '*/' {$channel=HIDDEN;} 

EDIT:

Может быть, это не из-за вашего LeXeR, но из-за вашего Parser. Из lexer с $ channel = HIDDEN вы сообщаете, что все эти элементы не передаются в Parser. Вот почему парсер сначала находит EOF. Вы ничего не посылаете!

Если вы пишете пробел в качестве первого символа, синтаксический анализатор получает что-то и способен обрабатывать ввод ...

Это должен быть ваш вопрос !!

Надеюсь, это поможет вам!

+0

Спасибо за ответ. К сожалению, это тоже не работает. Опять же, проблема возникает только в том случае, если комментарий начинается с первого символа файла. Это почти так, как если бы первый символ «/» игнорировался парсером, а все остальные символы «*», «комментарий» и т. Д. Рассматривались как токены. Далее я расскажу подробнее, сейчас я занят отдельным проектом. –

+0

ой! Я сделал пересмотр вопроса, и идея пришла ко мне ... Я отредактирую свой ответ –

+0

Спасибо за доработку! Тем не менее, я все еще немного смущен. Как вы можете видеть в моем исходном посте, {$ channel = HIDDEN; } присутствует и для whitespace ... почему парсер получит вход для пробелов, который HIDDEN, но не комментарий? Для записи я также попробовал «skip()»; вместо «$ channel = HIDDEN»; и я получаю ту же проблему. –

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