Antlr4分配中的空间

时间:2015-02-27 17:10:22

标签: whitespace variable-assignment antlr4 operator-precedence

我试图在ANTLR 4中编写一个简单的解析器,它能够处理这样的事情:

java.lang.String dataSourceName=FOO
java.lang.Long dataLoadTimeout=30000

这就是我在.g4文件中添加的内容:

cfg             :   (paramAssign NEWLINE)* ;
paramAssign     :   paramDecl '=' paramVal ;
paramDecl       :   javaType paramName ;
paramName       :   SIMPLEID ;
paramVal        :   PARAMVAL ;
javaType        :   JAVATYPE ;
SIMPLEID        :   [a-zA-Z_][a-zA-Z0-9_]* ;
PARAMVAL        :   [0-9a-zA-Z_]+ ;
JAVATYPE        :   SIMPLEID ('.' SIMPLEID)* ;
NEWLINE         :   '\n' ;

当我在上面的输入上运行时,我得到:

line 1:16 token recognition error at: ' '
line 2:14 token recognition error at: ' '
line 1:32 mismatched input 'FOO' expecting PARAMVAL

我知道ANTLR的lexer& amp;解析器跟随,但我不清楚我是如何违反它们的。出于某种原因,它不喜欢字符串FOO,尽管FOO明显符合PARAMVAL规则。另外,当我在前后放置空格时在得到相同的迹象之后我得到:

token recognition error at: ' '

我已添加的每个空间。对不起,我真的很困惑。

1 个答案:

答案 0 :(得分:0)

FOO被匹配为SIMPLEID令牌,而不是PARAMVAL令牌。这就是ANTLR的工作原理:每当2个(或更多)词法分析器规则匹配相同数量的字符时,首先定义的规则将获胜(在您的情况下为SIMPLEID)。

因此,如果您让paramVal也与SIMPLEID匹配,错误就会消失:

paramVal        :   SIMPLEID | PARAMVAL ;

要让recognition error at: ' '消失,您还必须匹配空格字符:

SPACE           :   [ \t]+ -> skip ;