저는 파서를 연구 중이므로 정말 실망합니다. 언어, 우리는 같은 표현을 가질 수 있습니다해피/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인지 확인하는 것이 좋습니다 (이 문제는 잘 문서화되어 있습니다).
무엇이 잘못 될지 이해할 수 있습니까? 나는 정말로 당신의 도움에 감사합니다, 나는 문제를 파악하려고 노력하는 풍차에 정말로 기울고 있습니다.
그래, 그게 정확히 문제가되었다. 나는 어제 오후에 내가 잘못된 장소에서 문제를 찾고 있다는 것을 깨달았습니다. 그리고 문제가 무엇인지 깨닫 자마자 실제로 같은 해결책을 얻었습니다. 빈 배열을 하나의 토큰으로 만들었습니다. 감사! 이 벌레가 나를 죽였어. –