2017-05-14 13 views
0

私は共通の接頭辞(<id>)でこの文法を持っています。一般的な接頭辞を避けるための文法の変換

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

問題は(<id>Assignment())* <id>Declaration()です。文法は、0以上のAssignments/Read/Write文を持つことができますが、少なくとも1つの宣言と、任意の文/宣言を任意の順序で持つことができます。

答えて

1

これをリファクタリングするのは簡単ですが、私はおそらくそれをしません。おそらくもう少し先を見ています。ここでは、2つのソリューション


ファクターは

void Components() : {} 
{ 
    (Read() | Write())* 
    (LOOKAHEAD(2) <id> Assignment())* 
    <id> Declaration() 
    (Read() 
    | Write() 
    | LOOKAHEAD(2) <id> Assignment() 
    | <id> Declaration()) 
    )* 
} 
長い先読み
を使用 <id>

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

外です

関連する問題