我试图在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: ' '
我已添加的每个空间。对不起,我真的很困惑。
答案 0 :(得分:0)
FOO
被匹配为SIMPLEID
令牌,而不是PARAMVAL
令牌。这就是ANTLR的工作原理:每当2个(或更多)词法分析器规则匹配相同数量的字符时,首先定义的规则将获胜(在您的情况下为SIMPLEID
)。
因此,如果您让paramVal
也与SIMPLEID
匹配,错误就会消失:
paramVal : SIMPLEID | PARAMVAL ;
要让recognition error at: ' '
消失,您还必须匹配空格字符:
SPACE : [ \t]+ -> skip ;