Встроенные комментарии и пустая строка в грамматике antlr4 - PullRequest
0 голосов
/ 10 декабря 2018

, пожалуйста, кто-нибудь может мне объяснить, что мне нужно изменить в этой грамматике для поддержки встроенных комментариев (например, // some text) и пустой строки (которая содержит любое количество пробелов).Я пишу следующую грамматику, но это не работает.

program: line* EOF ;
line: (expression | assignment) (NEWLINE | EOF);
assignment : VARIABLE '=' expression ;
expression : '(' expression ')'                   #parenthesisExpression
           | '-' expression                       #unaryExpression
           | left=expression OP1 right=expression #firstPriorityExpression
           | left=expression OP2 right=expression #secondPriorityExpression
           | number=NUMBER                        #numericExpression
           | variable=VARIABLE                    #variableExpression
           ;

NUMBER : [0-9]+ ;
VARIABLE : [a-zA-Z][a-zA-Z0-9]* ;
OP1 : '*' | '/' ;
OP2 : '+' | '-' ;

NEWLINE : '\r'? '\n' ;

WHITESPACE : [ \t\r]+ -> skip ;
COMMENT : '//' ~[\n\r]* -> skip ;

1 Ответ

0 голосов
/ 10 декабря 2018

Тот факт, что вы добавили - в правило синтаксического анализатора в качестве литерального токена, а также заставил OP2 соответствовать этому символу, приводит к тому, что OP2 никогда не соответствует -.Вам нужно иметь правило лексера, которое соответствует только одному знаку минус (, как я показал ранее ):

op1
 : MUL
 | DIV
 ;

op2
 : ADD
 | MIN
 ;

...

MUL        : '*' ;
DIV        : '/' ;
ADD        : '+' ;
MIN        : '-' ;

, а затем используйте MIN в вашей унарной альтернативе:

...
| MIN expression                       #unaryExpression
...

Когда у вас есть отдельное правило MIN : '-' ;, вы можете сделать это:

...
| '-' expression                       #unaryExpression
...

, потому что теперь ANTLR «знает», что вы имеете в виду правило, которое соответствует одному -, но ANTLRне «знает» об этом, когда у вас есть правило лексера, которое соответствует - или +, как ваше правило OP2:

OP2 : '+' | '-' ;
...