Как использовать текст до новой строки в ANTLR?

Как вы делаете что-то подобное с ANTLR?

Пример ввода:

title: hello world

Грамматика:

header : IDENT ':' REST_OF_LINE ;
IDENT : 'a'..'z'+ ;
REST_OF_LINE : ~'\n'* '\n' ;

Не получается, с line 1:0 mismatched input 'title: hello world\n' expecting IDENT

(Я знаю, что ANTLR является излишним для разбора MIME-подобных заголовков, но это только начало более сложного файла.)


person Rob N    schedule 21.01.2012    source источник


Ответы (2)


Это не удается, строка 1:0 не соответствует вводу 'title: hello world\n', ожидая IDENT

Вы должны понимать, что лексер работает независимо от парсера. Независимо от того, что синтаксический анализатор «хочет» сопоставить в определенное время, лексер просто создает токены, следуя некоторым строгим правилам:

  1. попытаться сопоставить токены сверху вниз в правилах лексера (правила, определенные первыми, пробуются первыми);
  2. сопоставьте как можно больше текста. Если 2 правила соответствуют одному и тому же объему текста, то правило, определенное первым, будет сопоставлено.

Из-за правила 2 ваш REST_OF_LINE всегда будет "выигрывать" из правила IDENT. Единственный раз, когда токен IDENT будет создан, это когда в конце больше не будет \n. Вот что не так с вашими грамматиками: в сообщениях об ошибках говорится, что он ожидает токен IDENT, который не найден (но создается токен REST_OF_LINE).

Я знаю, что ANTLR является излишним для разбора MIME-подобных заголовков, но это только начало более сложного файла.

Вы не можете просто определить токены (правила лексера), которые хотите применить к заголовку файла. Эти токены также будут применяться к остальной части более сложного файла. Возможно, вам следует предварительно обработать заголовок отдельно от остальной части файла?

person Bart Kiers    schedule 21.01.2012

Разбор antlr обычно выполняется в 2 этапа. 1. построить свой аст 2. определить свой грамматик

псевдокод (прошло несколько лет с тех пор, как я играл с antlr) - AST:

WORD : 'a'..'z'+ ;
SEPARATOR : ':';
SPACE : ' ';

псевдокод - парсер дерева:

header: WORD SEPARATOR WORD (SPACE WORD)+

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

person Raghu    schedule 21.01.2012
comment
К сожалению, я хочу прочитать весь текст до конца строки, который может включать цифры, буквы, знаки препинания. - person Rob N; 21.01.2012
comment
Нет, вы не начинаете с AST, вы начинаете с грамматики. Кроме того, создание AST даже не является обязательным: вы можете просто работать с деревом синтаксического анализа. - person Bart Kiers; 21.01.2012