任何人都可以向我解释一下,我需要更改此语法以支持行内注释(例如// 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 ;
答案 0 :(得分:2)
您在解析器规则中添加了-
作为文字标记,并且使OP2
与此字符匹配的事实导致OP2
从未与-
匹配。您需要具有仅与单个减号(as I showed earlier)匹配的词法分析器规则:
op1
: MUL
| DIV
;
op2
: ADD
| MIN
;
...
MUL : '*' ;
DIV : '/' ;
ADD : '+' ;
MIN : '-' ;
,然后在您的一元替代方案中使用MIN
:
...
| MIN expression #unaryExpression
...
当您有单独的MIN : '-' ;
规则时,可以执行以下操作:
...
| '-' expression #unaryExpression
...
因为现在ANTLR“知道”,您的意思是匹配单个-
的规则,但是当您有匹配-
或{{ 1}}就像您的+
规则:
OP2