Как разделить приоритет и выражение в ANTLR4 - PullRequest
0 голосов
/ 08 сентября 2018

Я указал приоритет и ассоциативность следующим образом:

expr
    : LB expr RB
    | <assoc=right> (SUB | NOT) expr
    | expr op=(MULTI | DIV | MOD | AND) expr      
    | expr op=(ADD | SUB | OR) expr          
    | expr comparator expr    
    | expr op=(ANDTHEN | ORELSE) expr                   
    | INTLIT                                
    ;

Но это также работает на ( 1 and 2 ). Я хочу представить выражение только для целых чисел (то есть, работать только на + - * /) или логических (AND OR). Как я могу это сделать?

1 Ответ

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

Это не проблема приоритета, это проблема типа, и поэтому она должна быть обработана средством проверки типов.

У вас может возникнуть желание разделить вашу грамматику на такие правила, как integerExpression и booleanExpression, и, безусловно, возможно создать грамматику, отклоняющую 1 and 2 таким образом. Но этот подход делает вашу грамматику излишне сложной и достигнет своих пределов, когда ваш язык станет еще немного более мощным. Например, когда вы вводите переменные, вы хотите разрешить a and b тогда и только тогда, когда a и b являются булевыми переменными, но это не то, что вы можете сказать, просто взглянув на выражение. Поэтому в этом сценарии (и во многих других) вам понадобится код Java (или язык, который вы используете) для проверки типов в любом случае.

Итак, в заключение вы должны оставить грамматику как есть и отклонить 1 and 2 в средстве проверки типов.

...