请任何人解释我,我需要改变我的语法,以支持内联注释(如 // 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 回答
您在解析器规则中将_162__添加为文字标记,并使
OP2
与此字符匹配的事实导致OP2
永远不会匹配-
. 您需要一个仅匹配单个减号(as I showed earlier)的词法分析器规则:然后在你的一元替代中使用
MIN
:如果您有单独的
MIN : '-' ;
规则,则可以执行以下操作:因为现在ANTLR "knows"你的意思是匹配单个
-
的规则,但是当你的词法分析规则匹配-
或+
之类的OP2
规则时,ANTLR不会"know":