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。
我想创建一个语法来解析输入语句
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。