Antlrworks - 无关的输入

时间:2014-01-20 19:42:43

标签: antlr wikipedia antlrworks

我是新手,因此我需要你的帮助..   我正在尝试解析维基百科转储,我的第一步是将他们定义的每个规则映射到ANTLR,不幸的是我遇到了第一个障碍:

第1行:8个无关的输入'''''期待'\'\''

我不明白发生了什么,请借给我你的帮助。

我的代码:

grammar Test;

options {
    language = Java;
}

parse
    :  term+ EOF
    ;

term 
    :  IDENT
    |  '[[' term ']]'
    |  '\'\'' term '\'\''
    |  '\'\'\'' term '\'\'\''
    ;    

IDENT
    :  ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')*
    ;

enter image description here

输入  ''''''Hello World'''''

1 个答案:

答案 0 :(得分:1)

词法分析器规则必须始终匹配至少1个字符。你的规则:

IDENT : ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')*;

匹配一个空字符串(其中包含无限量)。将*更改为+

IDENT : ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')+;

修改

  

输入'''''Hello World'''''

虽然您将文字标记放在解析器规则('\'\'\'''\'\''等)中,但您必须明白它们是在解析器的命令下而不是创建的。词法分析器遵循严格的规则来创建令牌:

  1. 尝试尽可能匹配
  2. 如果2个不同的词法规则匹配相同数量的字符,则首先定义的字符将优先
  3. 让我们为你的文字标记命名:

    BRACKET_OPEN  : '[[';
    BRACKET_CLOSE : ']]';
    Q3            : '\'\'\'';
    Q2            : '\'\'';
    IDENT         :  ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')+;
    

    现在,由于规则#1(尽可能匹配),输入'''''Hello World'''''将被标记为如下:

    • Q3
    • Q2
    • IDENT
    • Q3(是的,Q3!)
    • Q2

    但是您的解析器规则term只接受Q3 Q2 IDENT Q2 Q3,因此输入无法正确解析是正确的。

    另外,我建议你不要使用解释器:它是相当错误的。虽然调试器就像一个魅力!