2014-10-19 8 views
1

Jison에 파서를 구현하려고합니다. 파서는 JSON 객체 ({ a: 1 })와 블록 : if (true) { statement(); }을 모두 지원합니다. 나는 빈 객체와 빈 블록을 모두 지원해야하기 때문에빈 블록 및 빈 개체 문법 충돌 경고

block: 
    : '{' '}' 
    | '{' statementList '}' 
    ; 

objectExpression: 
    : '{' '}' 
    | '{' properties '}' 
    ; 

blockobjectExpression 모두에서 {} 규칙이있다 : 같은

내 문법 보인다.

그것은 작동하지만, 다음과 같은 경고를 많이 출력 :

Conflict in grammar: multiple actions possible when lookahead token is ; in state 52 
- reduce by rule: objectExpression -> { } 
- reduce by rule: block -> { } 

이 어떻게 수정하거나 이러한 경고를 억제 할 수 있습니까?

답변

2

문자열 {}은 블록 또는 objectExpression으로 구문 분석 될 수 있습니다. 몇 가지 선택이 있습니다.

자바 스크립트 파서에서 blockobjectExpression 사이에 모호성이있는 경우 상위 규칙에서 첫 번째로 오는 것을 선택합니다. 다음 표현식에서 빈 블록보다 빈 블록이 우선됩니다.

expression: 
    : block 
    | objectExpression 
    ; 

파서는 모호성 (시프트/감소 충돌이라고도 함)에 대해 불만을 표시하지만 여전히 작동합니다. Jison 파서가 Bison 파서와 호환된다고 가정하면 expect declaration을 사용하여 경고를 표시하지 않습니다.

블록 및 objectExpressions을 다른 컨텍스트에만 표시 할 수도 있습니다 (예 : 블록은 if 문 또는 for 문 뒤에 만 나타날 수 있음). 세 번째 방법은 빈 객체에 대한 지원을 제거하는 것입니다.

1

나는 다른 렉스 규칙을 추가하여 결국 :

\{\} return 'EMPTY_OBJECT'; 

과는 objectExpression로 변경 : (이 약간 못생긴 비록)

objectExpression: 
    : 'EMPTY_OBJECT' 
    | '{' properties '}' 
    ; 

그것은했다.

+0

나는이 솔루션이 실제로 작동한다는 것에 회의적이다. (단지 '{}'와 '{}'를 구문 론적으로 구별하기 때문에). 그것을 철저히 시험하십시오. 올바른 해결 방법은 두 개의 빈 괄호 구문이 발생할 수있는 컨텍스트를 확인하는 것입니다. – rici