gpt4 book ai didi

java - 将无效字符视为 ANTLR4 词法分析器中的单个标记

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:16:31 25 4
gpt4 key购买 nike

我正在使用 JSON grammar from the antlr4 grammar repository为编辑器插件解析 JSON 文件。它有效,但一个一个地报告无效字符。以下代码段导致 18 个词法分析器错误:

{
sometext-without-quotes : 42
}

我想通过将相同类型的连续无效单字符标记视为一个更大的无效标记来将其归结为 1-2。

对于类似的问题,建议使用自定义词法分析器将“未知”元素粘合到较大的标记:In antlr4 lexer, How to have a rule that catches all remaining "words" as Unknown token?

我假设这会绕过通常的词法分析器错误报告,如果可能的话,我想避免这种情况。这个相当简单的任务没有合适的解决方案吗?它似乎在 ANTLR3 中默认工作。

最佳答案

答案在您提供的链接中。我不想完全复制原始答案,所以我会尝试解释一下......

In antlr4 lexer, How to have a rule that catches all remaining "words" as Unknown token?

将未知数添加到将匹配这些的倍数的词法分析器中......

unknowns : Unknown+ ; 
...
Unknown : . ;

对这篇文章进行了编辑,以适应您只使用词法分析器而不使用解析器的情况。如果使用解析器,则不需要覆盖 nextToken 方法,因为可以在解析器中以更简洁的方式处理错误,即 unknowns 只是另一种标记类型就词法分析器而言。词法分析器将这些传递给解析器,然后解析器可以处理错误。如果使用解析器,我通常会将所有标记识别为单独的标记,然后在解析器中发出错误,即是否将它们分组。这样做的原因是所有错误处理都在一个地方完成,即它不在词法分析器和解析器中。它还使词法分析器更易于编写和测试,即它必须识别所有文本并且在任何 utf8 输入上都不会失败。有些人可能会做不同的事情,但这对我来说对用 C 语言手写的词法分析器很有效。解析器负责确定什么是真正有效的以及如何在其上出错。另一个好处是词法分析器相当通用并且可以重用。

仅针对词法分析器的解决方案...

检查链接处的答案并在答案中查找此评论...

... but I only have a lexer, no parsers ...

答案指出您重写了 nextToken 方法并详细介绍了如何执行此操作

@Override
public Token nextToken() {

代码中的重要部分是...

Token next = super.nextToken();

if(next.getType() != Unknown) {
return next;
}

此后的代码处理可以匹配错误标记的情况。

关于java - 将无效字符视为 ANTLR4 词法分析器中的单个标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36270681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com