【问题标题】:How to resolve conflict between two choices starting with same tokens in javacc如何解决javacc中以相同标记开头的两个选择之间的冲突
【发布时间】:2015-08-14 10:49:35
【问题描述】:

我正在尝试为某些特定格式的消息编写编译器。 如果我简化它,我的问题是:

< WORD : ([LETTER]){2,5}>
< ANOTHER_WORD : (<LETTER>|<DIGIT>){1,5}>
< SPECIAL_WORLD : "START">

void grammar():
{
}
{ 
 <WORD><ANOTHER_WORD>
| <SPECIAL_WORD><ANOTHER_WORD>
}

这里我的特殊词总是作为一个词匹配,这当然是合乎逻辑的,但由于冲突发生在生产的开始,我不知道如何解决它。 一些帮助将不胜感激。

【问题讨论】:

  • 在第一行,[LETTER] 应该是&lt;LETTER&gt;吗?

标签: compiler-construction lexer javacc


【解决方案1】:

START 的规则放在首位。与大多数词法扫描器生成器一样,JavaCC 使用选择最长可能的标记匹配的规则,然后,如果应用了两个或多个模式,则选择其中的第一个。

因此,您的 ANOTHER_WORD 规则只会在 WORD 不匹配时匹配,因此它只会匹配长度为 1 或包含数字的单词。

您似乎希望解析器状态会影响词法标记的识别方式。一般来说,词法扫描器的工作方式并非如此,但您可以使用 lexical states 实现有限形式的上下文扫描。

【讨论】:

  • 谢谢,改变顺序实际上解决了这个问题(但用另一个令牌造成了另一个歧义)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
相关资源
最近更新 更多