2011-02-20 6 views
0

저는 파서를 연구 중이므로 정말 실망합니다. 언어, 우리는 같은 표현을 가질 수 있습니다해피/YACC가 시프트 될 때 줄입니다.

new int[3][][] 

또는

new int[3] 

그것의 대부분은 끝에 빈 배열을 제외하고, 올바르게 구문 분석

.

Expression : int 
      char 
      null 
      (...many others...) 
      new NewExpression 

다음 NewExpression은 다음과 같습니다 : 내 파서에서 내가 가진

NewExpression : NonArrayType '[' Expression ']' EmptyArrays 
       | NonArrayType '[' Expression ']' 

다음 EmptyArrays 하나 이상의 빈 괄호입니다 - EmptyArrays는 빈 문자열을 유도하는 경우, 그것은 20 변화를 추가/감소 충돌 : 내가 파서에 대한 .info 파일을 보면

EmptyArrays : EmptyArrays EmptyArray 
      | EmptyArray 
EmptyArray : '[' ']' 

그러나,이 얻을 :

State 214¬ 
¬ 
▸ NewExpression -> NonArrayType lbrace Expression rbrace . EmptyArrays (rule 80)¬ 
▸ NewExpression -> NonArrayType lbrace Expression rbrace . (rule 81)¬ 
¬ 
▸ dot   reduce using rule 81¬ 
▸ ';'   reduce using rule 81¬ 
▸ ','   reduce using rule 81¬ 
▸ '+'   reduce using rule 81¬ 
▸ '-'   reduce using rule 81¬ 
▸ '*'   reduce using rule 81¬ 
▸ '/'   reduce using rule 81¬ 
▸ '<'   reduce using rule 81¬ 
▸ '>'   reduce using rule 81¬ 
▸ '<='   reduce using rule 81¬ 
▸ '>='   reduce using rule 81¬ 
▸ '=='   reduce using rule 81¬ 
▸ '!='   reduce using rule 81¬ 
▸ ')'   reduce using rule 81¬ 
▸ '['   reduce using rule 81 --I expect this should shift 
▸ ']'   reduce using rule 81¬ 
▸ '?'   reduce using rule 81¬ 
▸ ':'   reduce using rule 81¬ 
▸ '&&'   reduce using rule 81¬ 
▸ '||'   reduce using rule 81 

상태 214에 있고 왼쪽 중괄호가 보이면 스택으로 이동하고 EmptyArrays를 계속 분석해야합니다.

내가 정확히 수화물을 벗어날 때 (예 : NewExpression으로 구문 분석을 시작하여 추가 괄호를 올바르게 파싱하기 때문에) 무슨 일이 일어나고 있는지 정확히 알 수 없습니다. 표현식이나 명령문 또는 문법의 비 터미널이 왼쪽 중괄호로 시작하는 것은 불가능합니다. 특히 shift/reduce 충돌을 발생시키는 if/else 문과 비슷한 규칙을 가지고 있기 때문에 다음 토큰이 else인지 확인하는 것이 좋습니다 (이 문제는 잘 문서화되어 있습니다).

무엇이 잘못 될지 이해할 수 있습니까? 나는 정말로 당신의 도움에 감사합니다, 나는 문제를 파악하려고 노력하는 풍차에 정말로 기울고 있습니다.

답변

1

'['및/또는 ']'에 대해 우선 순위를 설정했을 수 있습니다.이 동작으로 인해 %left '['이 발생합니다. 선행 선언을 제거하면 여기에있는 shift/reduce 충돌이 나타납니다. 왜 그것의 교대/감소 갈등에 관해서는, 당신은 아마 또한 규칙이있다 : 배열 접근을위한

Expression: Expression '[' Expression ']' 

. 문제는 NewExpressionExpression이기 때문에 다음과 같은 색인이 올 수 있으며 '['의 미리보기를 보면 색인 표현식의 시작인지 또는 EmptyArray의 시작인지 알 수 없습니다 - 2 토큰 룩어 헤드가 필요합니다.

이 특정 사례를 시도해 볼 수있는 한 가지 방법은 여기에 필요한 추가 사전 검색을 수행하고 []을 단일 토큰으로 인식시키는 것입니다.

+0

그래, 그게 정확히 문제가되었다. 나는 어제 오후에 내가 잘못된 장소에서 문제를 찾고 있다는 것을 깨달았습니다. 그리고 문제가 무엇인지 깨닫 자마자 실제로 같은 해결책을 얻었습니다. 빈 배열을 하나의 토큰으로 만들었습니다. 감사! 이 벌레가 나를 죽였어. –

관련 문제