首页 文章

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

提问于
浏览
0

请任何人解释我,我需要改变我的语法,以支持内联注释(如 // 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 回答

  • 2

    您在解析器规则中将_162__添加为文字标记,并使 OP2 与此字符匹配的事实导致 OP2 永远不会匹配 - . 您需要一个仅匹配单个减号(as I showed earlier)的词法分析器规则:

    op1
     : MUL
     | DIV
     ;
    
    op2
     : ADD
     | MIN
     ;
    
    ...
    
    MUL        : '*' ;
    DIV        : '/' ;
    ADD        : '+' ;
    MIN        : '-' ;
    

    然后在你的一元替代中使用 MIN

    ...
    | MIN expression                       #unaryExpression
    ...
    

    如果您有单独的 MIN : '-' ; 规则,则可以执行以下操作:

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

    因为现在ANTLR "knows"你的意思是匹配单个 - 的规则,但是当你的词法分析规则匹配 -+ 之类的 OP2 规则时,ANTLR不会"know":

    OP2 : '+' | '-' ;
    

相关问题