antlr4 不解析明显的树

antlr4 does't parse obvious tree

我想创建一个语法来解析输入语句

myvar 是 43+23

myvar 的其他变量是 "hallo"

但是解析器无法识别这里的任何内容。 (抱歉,我不允许 post 图片 :( 想象一个带有令牌的语句节点 [myvar] [is] [43] [+] [23] as children 全部标红。其他语句也一样)

我收到令我困惑的错误消息:

行2:7输入没有可行的选择'myvaris'

行3:19输入没有可行的选择'otherVarofmyvaris'

空格哪里去了?我想,这是我的词法分析器的问题,但我看不出问题出在哪里。为了以防万一,下面是这些语句的语法:

statement
        : envCall                   #call_Environment_Function
        | identifier IS expression  # assignment_statement // This one should be used
        | loopHeader statement_block    # loop_statement
        etc... 

expression
    : '(' expression ')'                #bracket_Expression
    | mathExpression                    #math_Expression
    | identifier                        #identifier_Expression // this one should be used
    | objectExpression                  #object_Expression
    etc ...

identifier //both of these should be used
: selector=IDENTIFIER OF object=expression #ofIdentifier
| selector=IDENTIFIER #idLocal
;

这里是我目前所有的 Lexer 规则:

IdentifierNamespace: IDENTIFIER '.' IDENTIFIER;
FromIn: FROM | IN;

OPENBLOCK: NEWLINE? '{';
CLOSEBLOCK: '}' NEWLINE;

NEWLINE: ['\n''\t']+;
NUMBER: INT | FLOAT;
INT: [0-9]+;
FLOAT: [0-9]* '.' [0-9]+;

IsAre: IS | ARE;

OF: 'of';
IS: 'is';
ARE: 'are';
DO: 'do';
FROM: 'from';
IN: 'in';
IDENTIFIER : [a-zA-Z]+ ;
//WHITESPACE: [ \t]+ -> skip;
fragment UNICODE : 'u' HEX HEX HEX HEX ;
fragment HEX : [0-9a-fA-F] ;
fragment ESC : '\' (["\/bfnrt] | UNICODE) ;
STRING : '"' (ESC | ~["\])* '"' ;
END: 'END'[.]* EOF;
WHITESPACE : ( '\t' | ' ' )+ -> skip ;

好的,找到了。为解析器定义了一个 compOP,它搞乱了树生成。

compOP: '<'
  | '>'
  | '=' // the programmers '=='
  | '>='
  | '<='
  | '<>'
  | '!='
  | 'in'
  | 'not' 'in'
  | 'is' <- removed this one and it works now
  ;

所以:我猜永远不要将相同的关键字分配给 Parser 和 Lexer。