【发布时间】:2010-04-29 06:40:15
【问题描述】:
我需要让 JavaCC 了解上下文(当前父令牌),并且根据该上下文,预计会出现不同的令牌。
考虑以下伪代码:
TOKEN <abc> { "abc*" } // recognizes "abc", "abcd", "abcde", ...
TOKEN <abcd> { "abcd*" } // recognizes "abcd", "abcde", "abcdef", ...
TOKEN <element1> { "element1" "[" expectOnly(<abc>) "]" }
TOKEN <element2> { "element2" "[" expectOnly(<abcd>) "]" }
...
因此,当生成的解析器在“内部”一个名为 "element1" 的令牌并且遇到 "abcdef" 时,它会将其识别为 <abc>,但是当它“内部”一个名为 "element2" 的令牌时,它会识别与<abcd>.
element1 [ abcdef ] // aha! it can only be <abc>
element2 [ abcdef ] // aha! it can only be <abcd>
如果我没记错的话,它的行为类似于更复杂的 XML 文件的 DTD 定义。
那么,如何指定在哪个“上下文”中哪个令牌是有效/预期的?
注意:对于我的实际案例来说,定义一种令牌的“层次结构”是不够的,因此“abcdef”总是首先与<abcd> 匹配,而不是<abc> .我真的需要上下文感知令牌。
【问题讨论】:
-
我发现
JavaCC允许指定词法上下文。可悲的是,当您有 许多 令牌而其中大多数都需要 自己的 状态时,这会使一切变得非常复杂。我已经开发了一个确定性状态机解析器,目前正在对其进行增强以接受非确定性状态机。我必须承认,我的情况很特别。