2013-01-07 5 views
1

내가 간단한 파서를 만들려고 해요하지만 첫 번째 요소 앞에 계정에 선택적 부호을하려고 할 때 나는 약간의 문제에 봉착 일으키는 작업을 추가 JavaCC에 나는 현재 선택 충돌을 얻고있다이 문제

void addop() : {} 
    { 
     <PLUS> | <MINUS> 
    } 

하고 사용하는 것이 좋습니다 : [- -] 5 + 3 여기에 4

문제가 첫 번째 옵션 함께 [addop()] 로 정의된다 LOOKAHEAD()하지만 LOOKAHEAD()를 사용할 때 javacc가 인식 할 수있는 선택 충돌이 없습니다

미리 감사드립니다!

답변

0

일반적으로 단항 - 빼기 및 -plus에 이진 대응보다 높은 우선 순위를 부여하려고합니다.

// ... 

void add() : {} 
{ 
    mul() (<PLUS> mul() | <MINUS> mul())* 
} 

void mul() : {} 
{ 
    unary() (<MULTIPLY> unary() | <DIVIDE> unary())* 
} 

void unary() : {} 
{ 
    <PLUS> atom() | <MINUS> atom() | atom() 
} 

// ... 

어떤 LOOKAHEAD(...) 필요하지 않습니다 : 그래서, 당신이 뭔가를 할 거라고 상상할 것입니다.

1

더 많은 설명이 필요하다고 생각합니다. 나는 다음과 충돌하지 않는다.

void sum() : {} 
{ 
    [ addOp() ] 
    term() 
    (addOp() term())* 
} 

void addOp() : {} 
{  <PLUS> | <MINUS> } 

void term() : {} 
{ 
    element() 
    ((<MULTIPLY> | <DIVIDE>) element())* 
} 

void element() : {} 
{ 
    <CONSTANT> | "(" sum() ")" 
}