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

在ANTLR4中优先匹配短令牌

郭琨
2023-03-14
MILLI_OR_METRE:     'm' ;
OSMOLE:             'osm' ;
MONTH:              'mo' ;
SECOND:             's' ;

标准的TestCase之一是MOSM,lexer应该从中生成令牌流milli_or_metre osmole。不幸的是,由于ANTLR优先匹配较长的令牌,它生成令牌流月秒毫米波或米波,这将导致解析器引发错误。

是否可以先让ANTLR4 lexer尝试使用较短的令牌进行匹配?向month添加lookahead-type规则并不是一个很好的解决方案,因为我需要考虑各种潜在的词法冲突(例如,mol被命名为month litre,而不是mole,等等)。

编辑:

MONTH:  'mo' { _input.La(1) != 's' && _input.La(1) != 'l' && _input.La(1) != '_' }? ;

// (note: this is a C# project; java would use _input.LA instead)

但这并不是一个真正的可扩展或可维护的解决方案,而且还会引入其他我还没有遇到的微妙问题。

共有1个答案

谢胤
2023-03-14

您的问题并不要求首选较小的令牌(在这种情况下,将永远不会匹配月份)。您需要一个取决于文本是否匹配的回溯行为。对吧?

ANTLR将标记化和解析严格分开。因此,你的问题的每一个解决方案看起来都像是一个黑客。

然而,其他解析器生成器专门处理类似您的问题。Packrat解析器(PEG)是回溯的,允许动态标记化。为此尝试蒸谷底。

 类似资料:
  • 我是一个Antlr4新手,有一个相对简单的语法问题。语法在末尾的底部给出。(这是一个语法片段,用于分析生物序列变体的描述)。 在下面的单元测试中,我试图解析字符串。 这里出了什么问题?我在哪里可以学习如何解决这个问题?

  • 问题内容: 我对使用ngram的单词有部分匹配。如何修改映射以始终偏爱精确匹配而不是ngram令牌?我不想修改查询。一个搜索框将搜索多种类型,每种类型都有各自的字段。 例如,假设我正在搜索职位,一个人的标题为“现场工程师”,另一个人的标题为“引擎技术员”。如果用户搜索“引擎”,我希望ES将后者返回为更相关。 我几乎逐字使用此映射:例外:我使用的ngram的最小值为3,最大值为11,而不是边缘ngr

  • 我在这里开发了一个小语法,我有一个问题: 为什么解析器没有在解析树的顶部看到(->)规则?这是优先级问题吗?

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

  • 效果很好。但是我也想匹配包含关键字的句子,这些关键字不会被期望终止ID+块。例如 fist显示为,然后作为第一个ID+的一部分。按照上面链接的问题的例子,我可以这样修复它: 它起作用了,而且做的正是我想要的。在我的真实语言中,我有数百个关键字列表,用于不同类型的句子,所以如果我尝试这种方法,我肯定会犯错误,当我在我的语言中创建新的结构时,我必须返回并编辑所有其他结构。 最好是从列表中进行非贪婪匹配

  • 假设以下进程在指定的时间到达执行。每个进程将运行列出的时间量。 我想绘制甘特图并计算抢占式最短作业优先调度的平均等待时间。 解决办法 http://imgur.com/fP8u61C 等待时间为2毫秒。 请告诉我这是否正确。 我怀疑的步骤是,在进程B到达的3ms时,调度程序是完成进程A还是启动进程B。