Я использую ANTLRv3 для разбора ввода, которое выглядит так:
* 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
не совпадает из-за MissingTokenException
. Что не так с грамматикой, что мне нужно изменить, чтобы звёзды были частью ITEM_TEXT
?