Antlrworks-外部输入

Antlrworks-外部输入,antlr,wikipedia,antlrworks,Antlr,Wikipedia,Antlrworks,我是新手,因此我需要你的帮助。。 我试图解析Wikipedia转储,我的第一步是将它们定义的每个规则映射到ANTLR,不幸的是,我遇到了第一个障碍: 第1行:8外部输入“预期” 我不明白发生了什么事,请帮我一下 我的代码: grammar Test; options { language = Java; } parse : term+ EOF ; term : IDENT | '[[' term ']]' | '\'\'' term

我是新手,因此我需要你的帮助。。 我试图解析Wikipedia转储,我的第一步是将它们定义的每个规则映射到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”

lexer规则必须始终至少匹配一个字符。你的规则:

IDENT : ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')*;
匹配一个空字符串(其中有无限多个值)。将
*
更改为
+

IDENT : ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')+;
编辑 输入“你好,世界”

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

  • 它尽可能地匹配
  • 如果两个不同的lexer规则匹配相同数量的字符,则首先定义的一个将获得优先权
  • 让我们为文字标记命名:

    BRACKET_OPEN  : '[[';
    BRACKET_CLOSE : ']]';
    Q3            : '\'\'\'';
    Q2            : '\'\'';
    IDENT         :  ('a'..'z' | 'A'..'Z' | '0'..'9' | '=' | '#' | '"' | ' ')+;
    
    现在,由于规则1(尽可能匹配),输入的
    “Hello World”
    将标记如下:

    • Q3
    • Q2
    • IDENT
    • Q3
      (是的,a
      Q3
      !)
    • Q2
    但是您的解析器规则
    术语
    将只接受
    Q3 Q2 IDENT Q2 Q3
    ,因此您的输入无法正确解析是正确的


    另外,我建议您不要使用解释器:它相当麻烦。调试器的工作方式很有魅力

    我错过了测试,tks我将规则更改为加号(+),但不幸的是没有解决问题:(,已更改解析:term*EOF//现在我可以插入nocharacter@user3216500,然后我需要更多信息。你发布了你的全部语法吗?你能发布你正在解析的输入吗?你是如何测试的:在AntlWorks的解释器或其调试器中?我添加了输入“Hello World”,我正在使用解释器,是的,它是整个语法:)@user3216500 AntlWorks 1.x中的解释器功能经常非常不准确。您不应该相信它的结果能够代表运行语法时实际发生的情况。@user3216500,检查我的编辑