内联注释和Antlr4语法中的空行

时间:2018-12-10 06:55:14

标签: antlr antlr4

任何人都可以向我解释一下,我需要更改此语法以支持行内注释(例如// 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 :(得分: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
相关问题