ANTLR4 типы переменных и порядок операций - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть две грамматики:

Hello.g4:

grammar Hello;
start: exp? EOF;
exp: int_exp | vector_exp;
int_exp: int_exp '*' int_exp | int_exp '+' int_exp | INT;
vector_exp: vector_exp '*' int_exp | int_exp '*' vector_exp | 
            vector_exp '+' vector_exp | VECTOR;
INT  : ('0'..'9') | (('1'..'9')('0'..'9')+);
VECTOR: 'v';
WS  : [ \t\r\n]+ -> skip ;

Hello2.g4

grammar Hello2;
start: exp? EOF;
exp: add;
add: add '+' add | mult '+' add | add '+' mult | mult;
mult: mult '*' mult | INT '*' mult | mult '*' INT | INT | VECTOR;
INT  : ('0'..'9') | (('1'..'9')('0'..'9')+);
VECTOR: 'v';
WS  : [ \t\r\n]+ -> skip ;

Первая грамматика проверяет типы правильно: добавление вектора в скаляр v+1 не работает. Но он не может иметь правильный порядок операций.

1+1*v дает

wrong order

Вторая грамматика имеет правильный порядок, но допускает v+1, что не должно работать.

Я понимаю , почему грамматики так работают, но я не могу объединить эти два, создавая грамматику, которая проверяет типы и имеет правильный порядок операций.

Что бы я ни проверял первым, работает, моя проблема в том, что я должен начать где-то ломать то, что я делаю вторым. Как можно объединить эти два требования?

1 Ответ

0 голосов
/ 15 сентября 2018

Не разрешать добавлять скаляр к вектору - это семантическое правило, а не синтаксическое. Парсер может охватывать только синтаксические правила. Вы должны применять семантические правила после разбора, например, у посетителя, который ходит по обработанному дереву разбора.

...