У меня есть следующая простая ANTLR грамматика:Простая грамматика не сумеет Разбирает
grammar Grammar;
grammarRules : grammarRule+ ;
grammarRule:
lhs '->' WORD+
;
lhs: ID ;
WORD : LETTER+ ;
ID : LETTER (LETTER|'0'..'9')* ;
fragment
LETTER : [a-zA-Z\u0080-\u00FF_] ;
WS : [ \t] -> skip ;
Когда я пытаюсь разобрать строку «веб-страница -> Поиск Google», я получаю ошибку:
line 1:0 mismatched input 'webpage' expecting ID
Хорошо, поэтому большая точка, кажется, заключается в том, что лексер работает как свой собственный слой, полностью отличный от шага парсера, поэтому лексер обременен ответственностью за выяснение, что делать в случаях двусмысленности. В этом отношении мне любопытно, почему добавление терминатора утверждения устраняет проблему двусмысленности. –
@ DanielBigham Вы правы. Этого, вероятно, будет недостаточно. Вам нужно будет сделать что-то вроде 'lhs -> ID | Слово'. При этом вам, вероятно, не понадобится ограничитель строки, потому что ANTLR-парсеры LL (*). (Если бы они были только LL (1).) – Gene
Для других людей, которые могут найти это позже - я вытягивал свои волосы с помощью Antlr, получая всевозможные странные поступки, а затем я кое-что прочитал о рефакторинге моей грамматики, первичная грамматика содержится с одним правилом, а не разбивается на многие правила с разными символами. Это, по-видимому, позволяет лучше лечить рекурсию грамматики. Престо, сейчас он работает хорошо. –