gpt4 book ai didi

JavaCC - 如何在不前瞻的情况下删除此语句中的所有选择冲突?

转载 作者:行者123 更新时间:2023-11-30 05:43:10 25 4
gpt4 key购买 nike

我目前正在为我的语法开发一个解析器。我的目标是在没有前瞻的情况下实现它,而这正是我真正正在努力解决的问题。

这是一个缩小的示例,我相信它足以证明我遇到的问题。

void main() : {}
{
(A())* (B())*
}

void A() : {}
{
C() <ID>
}

void B() : {}
{
<ID> Z()
}

void C() : {}
{
<bah>
| <bha>
| <ID>
}

这是输出警告(我想删除它)

Warning: Choice conflict in (...)* construct at line 200, column 23.
Expansion nested within construct and expansion following construct
have common prefixes, one of which is: <ID>
Consider using a lookahead of 2 or more for nested expansion.

最佳答案

我们确实需要更多地了解Z。我假设 L(Z) (即由 Z 生成的语言)不包含空序列,也不包含以 ID< 开头的序列bhabah。我还假设 main 之后的第一个标记不能是 IDbhabah

在这种情况下,我几乎肯定会使用前瞻

void main() : {}
{
AsBs()
}

void AsBs() : {}
{
LOOKAHEAD( A() )
A() AsBs() ;
|
(B()*)
|
{/*nothing*/}
}

与原始帖子中一样,使用 ABC

<小时/>

但是,发帖者想要一个不使用前瞻的解决方案。这是一个。我做出了与上面相同的假设。

void main() : {}
{
AsBs()
}

void AsBs() : {}
{
C1() <ID> AsBs()
|
<ID> // This ID might be the start of either A or B
( <ID> AsBs() // That ID started an A
| Z() (B())* ) // That ID started a B.
|
{/*nothing*/}
}

void B() : {}
{
<ID> Z()
}

void C1() : {}
{
<bah>
| <bha>
}

此处不需要 AC

关于JavaCC - 如何在不前瞻的情况下删除此语句中的所有选择冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55319102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com