当前位置: 首页 > 知识库问答 >
问题:

ANTLR 4.5-不匹配的输入'x'期望'x'

朱睿
2023-03-14

我已经开始使用ANTLR,并注意到它的lexer规则非常易变。一个极其令人沮丧的例子如下:

grammar output;

test: FILEPATH NEWLINE TITLE ;

FILEPATH: ('A'..'Z'|'a'..'z'|'0'..'9'|':'|'\\'|'/'|' '|'-'|'_'|'.')+ ;
NEWLINE: '\r'? '\n' ;
TITLE: ('A'..'Z'|'a'..'z'|' ')+ ;

此语法不会匹配以下内容:

c: \测试。txt
x

奇怪的是,如果我将TITLE更改为TITLE:'x';这次它仍然失败,给出一条错误消息说“不匹配的输入'x'期待'x'”,这非常令人困惑。更奇怪的是,如果我将testTITLE的用法替换为FILEPATH,整个事情都可以正常工作(尽管FILEPATH会比我希望匹配的更多,所以一般来说,它对我来说不是一个有效的解决方案)。

我非常困惑,为什么ANTLR会出现如此奇怪的错误,然后在处理事情时突然无缘无故地工作。

共有2个答案

权胜泫
2023-03-14

这不是OP的直接问题,但对于那些有相同错误消息的人,这里有一些您可以检查的内容。

当我引入一个新关键字时,我有相同的不匹配的Input'x'期望'x'模糊的错误消息。我的原因是我将新关键字放在了我的VARNAMElexer规则之后,该规则将其分配为变量名而不是新关键字。我通过将关键字放在VARNAME规则之前来修复它。

路雅懿
2023-03-14

这似乎是对ANTLR的常见误解:

ANTLR中的语言处理:

语言处理分为两个严格分离的阶段:

  • 词法分析,即将文本划分为标记

由于词法分析必须先于解析,因此有一个后果:词法分析器独立于解析器,解析器不能影响词法分析。

乐行

ANTLR中的弯曲工作如下:

  • 所有以大写字母开头的规则都是lexer规则
  • lexer从开头开始,试图找到与当前输入最匹配的规则
  • 最佳匹配是具有最大长度的匹配,即将下一个输入字符附加到最大长度匹配后得到的标记不符合任何lexer规则
  • 令牌由匹配项生成:
    • 如果一条规则与最大长度匹配匹配,则将相应的令牌推送到令牌流中
    • 如果多个规则匹配最大长度匹配,则语法中定义的第一个标记将推送到标记流

    你的语法有什么问题吗

    您的语法有两条至关重要的规则:

    FILEPATH: ('A'..'Z'|'a'..'z'|'0'..'9'|':'|'\\'|'/'|' '|'-'|'_'|'.')+ ;
    TITLE: ('A'..'Z'|'a'..'z'|' ')+ ;
    

    TITLE匹配的每个匹配也将由FILEPATH匹配。FILEPATH在TITLE之前定义:因此您期望成为标题的每个标记都将是FILEPATH。

    有两个提示:

    • 保持lexer规则不相交(任何标记都不应与另一个标记的超集相匹配)

 类似资料:
  • 问题内容: 作为一个初学者,当我从《权威的ANTLR 4参考》一书中学习ANTLR4时,我尝试从第7章运行修改后的练习版本: 由于Java属性只是键值对,因此我用来匹配eveything除外(我不希望它仅支持双引号中的字符串)。运行以下句子时,我得到: 当我改用它时,它可以工作。 我想知道我错在哪里,以便将来避免类似的错误。 请给我一些建议,谢谢! 问题答案: 由于ID和STRING都可以匹配以“

  • 我能够成功地设置parse(InputStream,DefaultHandler)方法签名的期望,但是当我试图模拟parse(InputSource,DefaultHandler)签名时,JMockit永远看不到调用,并抛出MissingInvocation异常。 下面的示例显示了两个测试用例,一个模拟InputSource风格,一个模拟InputStream风格: 运行testcase的结果是:

  • 以下语法在Antlr4.5和Java 1.8.45(IDE:IntelliJ Ultimate 14.1.4)中无法正常工作: 让正在评估的生成lexer和parser结果: 行1:22不匹配的输入“随机”期望方向 在使用的数据(文本文件)中,第二行已正确处理,但与上述错误消息一样,不是第一行。以下是正在使用的文本文件: 删除“行”定义中的那些空间不会发生错误。为什么?

  • 我是ANTLR的新手。我想写一个语法来解析下面的输入: 语法如下:: 当我尝试使用语法解析上述输入时,它会引发以下异常:: 第1行:0不匹配的输入'commit a1b2c3d4',应为'commit' 我已经引用了ANTLR4:不匹配的输入链接,但仍然不清楚发生了什么。

  • 我正在从版本2升级板条箱数据库。当我尝试升级在版本2中创建的表时,根据建议将x升级到3.1.6。x使用文档, https://crate.io/docs/crate/reference/en/latest/admin/system-information.html#tables-需要升级 在步骤5中, 质疑-