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

在ANTLR4 lexer中将无效字符视为单个令牌

柳正志
2023-03-14

我正在使用antlr4语法存储库中的JSON语法为编辑器插件解析JSON文件。它可以工作,但逐个报告无效字符。以下片段导致18个lexer错误:

{
   sometext-without-quotes : 42
}

我想通过将相同类型的连续的、无效的单字符令牌作为一个更大的无效令牌来处理,将其缩减为1-2。

对于一个类似的问题,有人建议使用一个自定义的lexer将“未知”元素粘附到较大的令牌上:在antlr4 lexer中,如何有一个规则来捕获所有剩余的“单词”作为未知令牌?

我假设这绕过了通常的lexer错误报告,如果可能的话,我希望避免这种情况。难道没有一个合适的解决方案来完成这个相当简单的任务吗?它似乎在antlr3中默认工作。

共有1个答案

东门理
2023-03-14

答案就在你提供的链接中。我不想完全照搬原来的答案,所以我会试着转述一下。

在antlr4 lexer中,如何有一个规则来捕获所有剩余的“单词”作为未知的令牌?

将未知项添加到将与这些项的倍数匹配的lexer中...

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

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

@Override
public Token nextToken() {    

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

Token next = super.nextToken();

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

之后的代码处理可以匹配坏令牌的情况。

 类似资料:
  • 问题内容: 如何爆炸以下字符串: 进入 以便将引号中的文本视为一个单词。 这是我现在拥有的: 但是我的代码将每个单词分成一个数组。如何使引号内的单词被视为一个单词? 问题答案: 您可以使用: 会产生: 如您所见,它还考虑了带引号的字符串中的转义引号。 编辑 简短说明: 并且在匹配而不是双引号的情况下,您可以执行以下操作:

  • 问题内容: 首先,我需要将ng- form设置为无效,因为它是向导的后续部分。表单包含带有元素的网格。每个元素都有其自己的验证,但是问题是,当没有元素时,表单将显示为有效。当行数为0时,我需要将其标记为对于开始情况无效。怎么做? 问题答案: 经过研究后,以下代码对我来说很好用。在控制器中: 超时确保我们可以访问该表单。它们不是在第一次通过控制器上构建的,因此需要超时或监视。然后,我们将表单标记为无

  • 问题内容: 将单个char传递给需要CharSequence的方法的最有效方法是什么? 这就是我得到的: 根据此处给出的答案,在输入为字符数组的情况下,这是一种明智的做法。我想知道是否可以在单字符案例中应用偷偷摸摸的快捷方式。 问题答案: textView.setText(String.valueOf(c))

  • 问题内容: 我已经在SO中看到了很多复杂的问题,无论某个复杂的结构是否被视为有效的JSON。 但是在频谱的另一端呢? 以上是有效的JSON吗? 问题答案: 是的,在大多数情况下。这是表示JSON值的有效JSON语法。 对此的困惑来自于Douglas Crockford的RFC 4627 ,它最初于2006年定义了互联网媒体类型。它说: JSON文本是序列化的对象或数组。 但是,正如Crockfor

  • 我想优化我的代码,避免错误,我有这个功能,但我认为我可以改善和避免内存问题。 该函数的思想是接收这种样式的字符串“0123456789”并将其传递给0x01、0x23、0x45、...在无符号字符数组中。任何提示,良好的实践或改进将是非常有用的。 用法是这样的: 在函数缓冲区中结束如下:

  • 问题内容: 我需要将String []转换为JsonArray,但我不知道如何。我是android开发的新手,我想在MySQL数据库中插入通话记录详细信息。因此,从android方面,我得到一个字符串,但是我不知道如何将该字符串转换为Jsonarray。请帮助解决这个问题,谢谢 这是我的Java代码....... 问题答案: 试试这个,