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)
但这并不是一个真正的可扩展或可维护的解决方案,而且还会引入其他我还没有遇到的微妙问题。
您的问题并不要求首选较小的令牌(在这种情况下,将永远不会匹配月份)。您需要一个取决于文本是否匹配的回溯行为。对吧?
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。