Я пытался использовать ANTLR4, чтобы определить диапазон обозначения как <1..100>
, и вот моя попытка:семантические предикаты неудачу, но не переходите к следующему один
@parser::members {
def evalRange(self, minnum, maxnum, num):
if minnum <= num <= maxnum:
return True
return False
}
range_1_100 : INT { self.evalRange(1, 100, $INT.int) }? ;
Но он не работает в течение более чем одного диапазон нравится:
some_rule : range_1_100 | range_200_300 ;
Когда я ввести номер (200
), он просто останавливается на первом правиле:
200
line 3:0 rule range_1_100 failed predicate: { self.evalRange(1, 100, $INT.int) }?
(top (range_1_100 200))
Это не так, как я ожидал. Как я могу сделать соответствие токена следующим правилом (range_200_300
)?
Я понимаю, но с ними трудно справиться после разбора. Если есть два правила: 'some_rule2: INT; some_rule3: INT; '. Они имеют разные диапазоны, и это вызывает неоднозначный синтаксис. Как я могу победить? – Wirelessr
Если вы хотите обработать проверку после разбора, используйте только одно правило 'range: INT;', а затем обработайте валидацию с посетителем. ANTLR генерирует базовые классы для них. Таким образом, вы устраняете неоднозначность и не смешиваете синтаксис и семантику. –
Я пробовал посетителя, но у меня большая проблема. Несмотря на то, что правило принимает более одного диапазона с разными числовыми диапазонами, psudocode похож на 'more_than_one: range_1_10 range_20_30? range_40_50? ', а реальное правило -' more_than_one: range + '. Как я могу различать эти диапазоны в 'visitMore_than_one()'? – Wirelessr