【问题标题】:Antlrworks - extraneous inputAntlrworks - 无关输入
【发布时间】:2014-01-20 19:42:42
【问题描述】:

我是这方面的新手,因此我需要你的帮助.. 我正在尝试解析 Wikipedia Dump,我的第一步是将它们定义的每个规则映射到 ANTLR,不幸的是我遇到了第一个障碍:

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

我不明白发生了什么,请帮助我。

我的代码:

grammar Test;

options {
    language = Java;
}

parse
    :  term+ EOF
    ;

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

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

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

【问题讨论】:

    标签: antlr wikipedia antlrworks


    【解决方案1】:

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

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

    匹配一个空字符串(其中有无数个)。将* 更改为+

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

    编辑

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

    尽管您将文字标记放在解析器规则中('\'\'\'''\'\'' 等),但您必须了解它们不是应解析器的要求创建的。词法分析器遵循严格的规则来创建标记:

    1. 它尝试尽可能多地匹配
    2. 如果 2 个不同的词法分析器规则匹配相同数量的字符,则第一个定义的将获得优先权

    让我们给你的文字标记一个名字:

    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,因此您的输入无法正确解析是正确的。

    另外,我建议您不要使用解释器:它相当有问题。不过,调试器的工作原理就像一个魅力!

    【讨论】:

    • 我错过了测试,tks 我将规则更改为 plus(+) 但不幸的是没有解决问题 :(, 更改了 parse : term* EOF // 现在我可以不插入任何字符了跨度>
    • @user3216500,那么我需要更多信息。您是否发布了整个语法?你可以发布你正在解析的输入吗?你是如何测试这个的:在 ANTLRWorks 的解释器或调试器中?
    • 我添加了输入 '''''Hello World''''' 我正在使用解释器,是的,它是整个语法:)
    • @user3216500 ANTLRWorks 1.x 中的解释器功能经常非常不准确。你不应该相信它的结果完全可以代表你运行语法时实际发生的事情。
    • @user3216500,检查我的编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    相关资源
    最近更新 更多