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

antlr4语法中的内联注释和空行,antlr,antlr4,Antlr,Antlr4,请任何人解释一下,为了支持内联注释(例如//一些文本)和空行(其中包含任意数量的空格字符),我需要更改此语法。我写以下语法,但这不起作用 program: line* EOF ; line: (expression | assignment) (NEWLINE | EOF); assignment : VARIABLE '=' expression ; expression : '(' expression ')' #parenthesisExpression

请任何人解释一下,为了支持内联注释(例如
//一些文本
)和空行(其中包含任意数量的空格字符),我需要更改此语法。我写以下语法,但这不起作用

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 ;

您在解析器规则中添加了
-
作为文字标记,并使
OP2
与此字符匹配,这会导致
OP2
从不与
-
匹配。您需要有一个只匹配单个减号()的lexer规则:

然后在一元选择中使用
MIN

...
| MIN expression                       #unaryExpression
...
当您有一个单独的
MIN:'-'规则,您可以执行以下操作:

...
| '-' expression                       #unaryExpression
...
因为现在ANTLR“知道”您指的是与单个
-
匹配的规则,但是当您有一个与
-
+
匹配的lexer规则时,ANTLR不“知道”这一点,就像您的
OP2
规则:

OP2 : '+' | '-' ;

您在解析器规则中添加了
-
作为文字标记,并使
OP2
与此字符匹配,这会导致
OP2
从不与
-
匹配。您需要有一个只匹配单个减号()的lexer规则:

然后在一元选择中使用
MIN

...
| MIN expression                       #unaryExpression
...
当您有一个单独的
MIN:'-'规则,您可以执行以下操作:

...
| '-' expression                       #unaryExpression
...
因为现在ANTLR“知道”您指的是与单个
-
匹配的规则,但是当您有一个与
-
+
匹配的lexer规则时,ANTLR不“知道”这一点,就像您的
OP2
规则:

OP2 : '+' | '-' ;

“它不起作用?”请详细说明。另外,
-
在表达式
-2-4
中是否仍然有效?我问你是因为你改变了语法,所以我建议你怎么做。是的,
-2-4
不起作用,它们被解释为两个独立的一元表达式。那就是问题所在,而不是
注释
规则,是吗?是。
注释
规则出现在
表达式
赋值
规则之后时效果良好。但我需要支持空行(仅限空格字符和行注释),可能需要将
\n
添加到
空白
规则:
空白:[\t\r\n]+->skip?“它不工作?”请详细说明。另外,
-
在表达式
-2-4
中是否仍然有效?我问你是因为你改变了语法,所以我建议你怎么做。是的,
-2-4
不起作用,它们被解释为两个独立的一元表达式。那就是问题所在,而不是
注释
规则,是吗?是。
注释
规则出现在
表达式
赋值
规则之后时效果良好。但我需要支持空行(仅限空格字符和行注释),可能需要将
\n
添加到
空白
规则:
空白:[\t\r\n]+->skip?感谢您的解释!谢谢你的解释!