我有这个带有公共前缀(<id>
)的语法,我想转换它以避免它们。
void Components() : {}
{
(Read() | Write())* (<id>Assignment())* <id>Declaration() (Read() | Write() | <id>(Assignment() | Declaration()))*
}
问题是(<id>Assignment())* <id>Declaration()
。语法可以包含0个或更多个分配/读/写语句,但至少有1个声明,然后是任何顺序的任何声明/声明。
答案 0 :(得分:1)
重构这很容易,但我可能不会这样做。我可能会向前看一点。这是两个解决方案
将<id>
void Components() : {}
{
(Read() | Write())*
<id>
(Assignment() <id>)*
Declaration()
( Read()
| Write()
| <id> (Assignment() | Declaration())
)*
}
使用更长的前瞻
void Components() : {}
{
(Read() | Write())*
(LOOKAHEAD( 2 ) <id> Assignment())*
<id> Declaration()
( Read()
| Write()
| LOOKAHEAD( 2 ) <id> Assignment()
| <id> Declaration())
)*
}