转换语法以避免使用常见前缀

时间:2017-05-14 09:54:51

标签: javacc

我有这个带有公共前缀(<id>)的语法,我想转换它以避免它们。

void Components() : {}
{
    (Read() | Write())* (<id>Assignment())* <id>Declaration() (Read() | Write() | <id>(Assignment() | Declaration()))*
}

问题是(<id>Assignment())* <id>Declaration()。语法可以包含0个或更多个分配/读/写语句,但至少有1个声明,然后是任何顺序的任何声明/声明。

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())
    )*
}