Я пытаюсь написать свой первый парсер с ANTLR4.Предполагается, что одно из правил, которые я использую в уже более крупном грамматическом файле, должно соответствовать 2 числам как 2D-точке.Вот сокращенный пример грамматики:
grammar example;
WS: [ \t\r\n]+ -> channel(HIDDEN);
INT: [0-9]+;
FLOAT: [0-9]*'.'?[0-9]+ ;
IDSTRING: [a-zA-Z_] [a-zA-Z0-9_]*;
NUMBER: (INT | FLOAT) ;
id: IDSTRING;
num: NUMBER;
sem: ';' ;
point: num num;
macro: 'MACRO' id macroprops* 'END ' id;
macroprops: macroorigin ;
macroorigin: 'ORIGIN' point sem;
Когда я знаю, введите базовый пример, подобный этому:
antlr4 example.g4 -o example/
cd example
javac *.java
echo -e "MACRO m_1\n ORIGIN 7 2.0 ;\nEND m_1" | grun example macro -tree
первый num
в точке соответствует обоим числам, и он бросаетошибка, что любое целое число (здесь 0) не является числом:
line 3:9 mismatched input '0' expecting NUMBER
(macro MACRO (id m_1) (macroprops (macroorigin ORIGIN (point (num 0 0) (num <missing NUMBER>)) (sem ;))) END (id m_1))
Я пробовал определение NUMBER
и point
для некоторых других способов, но я полагаю, что это должно работать следующим образом.Я даже не понимаю, как num
может соответствовать двум токенам.Кто-нибудь может помочь?