2012-01-21 2 views
1

Как вы делаете что-то подобное с 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-подобные заголовки, но это только на верхняя часть более сложного файла.)

ответ

3

Он выходит из строя, с линией 1: 0 несовпадающими вход «название: привет world \ n 'Ожидание IDENT

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

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

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

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

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

-1

antsr parsing обычно сделано в 2 этапа. 1. построить свой AST 2. определить ваш грамматику

псевдокод (уже несколько лет, так как я играл с ANTLR) - АСТ:

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

псевдокод - дерево синтаксического анализа:

header: WORD SEPARATOR WORD (SPACE WORD)+ 

Надежда, что помогает ....

+0

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

+0

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

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