简体   繁体   中英

Inline comments and empty line in antlr4 grammar

please can anyone explain me, what i need to change i this grammar to support inline comments (such as // some text ) and empty line (which contains any number of space characters). I write following grammar, but this doesn't work.

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 ;

The fact you added - in a parser rule as a literal token, and also made OP2 match this character causes OP2 to never match a - . You need to have a lexer rule that matches only the single minus sign ( as I showed earlier ):

op1
 : MUL
 | DIV
 ;

op2
 : ADD
 | MIN
 ;

...

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

and then use MIN in your unary alternative:

...
| MIN expression                       #unaryExpression
...

When you have a separate MIN : '-' ; rule, you could do this:

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

because now ANTLR "knows" you mean the rule that matches a single - , but ANTLR does not "know" this when you have a lexer rule that matches a either a - or + like your OP2 rule:

OP2 : '+' | '-' ;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM