Я использую ANTLRv3 разобрать вход, который выглядит следующим образом:ANTLR генерируется анализатор производит MissingTokenException
* this is an outline item at level 1
** item at level 2
*** item at level 3
* another item at level 1
* an item with *bold* text
Звезды в начале строки ознаменует начало элемента контура. Звезды также могут быть частью текста предмета (например, *bold*
).
Это грамматика для разбора элементов контурных без поддержки звезд в тексте пункта:
outline_item: OUTLINE_ITEM_MARKER ITEM_TEXT;
OUTLINE_ITEM_MARKER: STAR_IN_COLUMN_ZERO STAR* (' '|'\t');
ITEM_TEXT: ('a'..'z'|'A'..'Z'|'0'..'9'|'\r'|'\n'|' '|'\t')+;
fragment STAR_IN_COLUMN_ZERO: {getCharPositionInLine()==0}? '*';
fragment STAR: {getCharPositionInLine()>0}? '*';
Для входа *** foo bar
ANTLR производит следующее дерево разбора:
До сих пор это работает так, как ожидалось. Теперь я пытаюсь добавить звезду возможных символов текста элемента, так что я изменил правила для лексического анализатора ITEM_TEXT
к следующему:
ITEM_TEXT: ('a'..'z'|'A'..'Z'|'0'..'9'|'\r'|'\n'|' '|'\t'|STAR)+;
Теперь для того же вход следующего дерева синтаксического анализа производится:
Это выход в ANTLRWorks:
input.txt line 1:0 rule STAR failed predicate: {getCharPositionInLine()>0}?
input.txt line 1:1 missing OUTLINE_ITEM_MARKER at '** foo bar'
кажется, что OUTLINE_ITEM_MARKER
Didn 't соответствует из-за MissingTokenException
. Что не так с грамматикой, что мне нужно изменить, чтобы звезды стали частью ITEM_TEXT
?
Действительно, это упрощает грамматику совсем немного ... Однако ваша грамматика не делает различия между '*' в начале строки, а другая в другом: что-то пытается сделать OP. –
@BartKiers Перед тем, как принять это предположение, прочитайте предоставленную грамматику (или еще лучше проверьте ее в ANTLRWorks). – ironchefpython
Обратите внимание, что я не сказал, что ваше предложение не работает. Конечно, он работает с несколькими правилами, но я очень сомневаюсь, что OP делает только это: это можно сделать без помощи полномасштабного рекурсивного анализатора спуска. Вопрос OP состоит в том, как сделать различие между двумя одинаковыми символами (* в этом случае), когда они помещаются в определенное место на входе. Это то, что вы не адресуете в правилах lexer. –