Почему правило «точка» соответствует более чем одному числу? - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь написать свой первый парсер с 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 может соответствовать двум токенам.Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 01 июня 2018

Кажется, что ANTLR4 совпадает с жетонами в порядке их следования в грамматике.Добавление fragment к INT и FLOAT устранило проблему, так как NUMBER - единственный ТОКЕН, соответствующий определению числа, допускающий как плавающие, так и целые числа.

grammar example2;

WS: [ \t\r\n]+ -> channel(HIDDEN);

NUMBER: (INT | FLOAT) ;
fragment INT: [0-9]+;
fragment FLOAT: [0-9]*'.'?[0-9]+ ;
IDSTRING:  [a-zA-Z_] [a-zA-Z0-9_]*;

id: IDSTRING;
num: NUMBER;
sem: ';' ;
point: num num;

macro: 'MACRO' id macroprops* 'END ' id;
macroprops:  macroorigin ;
macroorigin: 'ORIGIN' point sem;

Большое спасибо за указаниесмотреть поток токенов.Но я до сих пор не понимаю, почему тогда это соответствует обоим числам правилу num в исходном вопросе.

РЕДАКТИРОВАТЬ: Другая ошибка была, как упоминал GRosenberg, просто определить элементы грамматики в порядке справа.поэтому NUMBER имеет более высокий приоритет, чем подчиненные.

...