我想创建一个将解析输入语句
的语法myvar是43 + 23
和
myvar的其他值是"你好"
但是解析器在这里没有识别任何东西。 (对不起,我不允许发布图片:(想象一下带有令牌的语句节点 [myvar] [是] [43] [+] [23]因为孩子都被标记为红色。同样适用于其他声明)
我收到的错误消息令我感到困惑:
第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 ;
答案 0 :(得分:1)
好的,找到了。为解析器定义了一个compOP,它正在弄乱树生成。
compOP: '<'
| '>'
| '=' // the programmers '=='
| '>='
| '<='
| '<>'
| '!='
| 'in'
| 'not' 'in'
| 'is' <- removed this one and it works now
;
所以:我猜是从不给Parser和Lexer分配相同的关键字。