Предикаты 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>}

Предикаты не эффективны.

Кто-нибудь может объяснить, почему? Благодарю.

0 ответов

Другие вопросы по тегам