2017-05-14 9 views
0

일반 접두어 (<id>)를 사용하여이 문법을 사용하고 있으며이를 피하기 위해 변형하고 싶습니다.일반적인 접두어를 피하기 위해 문법을 변환하십시오.

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

문제는 (<id>Assignment())* <id>Declaration()입니다. 문법은 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()) 
    )* 
}