Предикаты Antlr 4, включающие LT, не работают
Задал тот же вопрос снова с новыми более простыми и более проницательными примерами,
hleee : hlsss (' ' high ' ' hleee)? EOF ;
hlsss : ( low )(' ' hlsss)? ;
hilotest: hiloint (' ' hiloint)* EOF;
hiloint : low {print("low = " + $low.text)}
| high {print("high = " + $high.text)}
;
high : {int(self._input.LT(1).text) > 50}? Integer ;
low : {int(self._input.LT(1).text) <= 50}? Integer ;
Учитывая тот же вклад: "40 60 50"
Хлеи получил
line 1:3 rule low failed predicate: {int(self._input.LT(1).text) <= 50}?
с парсингом дерева:
(hleee (hlsss (low 40) (hlsss (low 60) (hlsss (low 50)))) <EOF>)
хилотест получил
low = 40
high = 60
low = 50
с парсингом дерева:
(hilotest (hiloint (low 40)) (hiloint (high 60)) (hiloint (low 50)) <EOF>)
Похоже, предикаты Antlr не работают хорошо, когда рекурсия становится более сложной.
*** оригинальный вопрос:
У меня есть следующий грамматик:
eee : sss (SPACE+ fff SPACE+ eee)? EOF ;
sss : ( Integer | vvv )(SPACE+ sss)? ;
fff : {self._input.LT(1).text == 'fff'}? Identifier ;
vvv : {self._input.LT(1).text != 'fff'}? Identifier ;
SPACE : ' ' ;
Integer: [0-9]+ ;
Identifier: [A-Za-z]+ ;
на входе '20 fff 30'я ожидал получить проанализированный результат:
eee -- sss --- 20
+-- fff --- fff
+-- eee --- sss --- 30
но вместо этого я получил,
line 1:3 no viable alternative at input 'fff'
(eee (sss 40 fff) 50)
line 1:7 extraneous input '50' expecting {' ', <INVALID>}
Предикаты не эффективны.
Кто-нибудь может объяснить, почему? Благодарю.