【问题标题】:Antlr4 Spaces within assignmentAntlr4 分配中的空间
【发布时间】:2015-04-30 11:45:51
【问题描述】:

我正在尝试在 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 的词法分析器和解析器遵循优先规则,但我不清楚我是如何违反它们的。出于某种原因,它不喜欢字符串FOO,尽管FOO 显然符合PARAMVAL 规则。另外,当我在等号之前和之后放置空格时,我得到:

token recognition error at: ' '

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

【问题讨论】:

    标签: whitespace variable-assignment antlr4 operator-precedence


    【解决方案1】:

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

    所以如果你让paramVal 也匹配SIMPLEID,错误就会消失:

    paramVal        :   SIMPLEID | PARAMVAL ;
    

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

    SPACE           :   [ \t]+ -> skip ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 2014-04-18
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多