현재 JavaCC에 대한 단일 문제가 있습니다. 문법을 정의했고 언어는 LL (1)이고 모든 Left Recursion이 제거되었습니다. 선택 충돌 오류가 발생합니다 (아래 덤프 됨). 나는 그것이 expr2()
자신을 부르고 갈등을 일으키는 라인 라인 에 의해 발생한다고 생각합니다 . 나는 솔직히 완전히 당황했다. 나는 문제를 해결하는 방법도 모릅니다.
다음은 경고를 생성하는 코드 스 니펫입니다.
void expr() : {}
{
<LBRAC> arg_list() <RBRAC> expression2()
}
void expr2() : {}
{
section() (<SUB>|<ADD>|<MUL>|<DIV>|<MOD> section())* expr2()
| {}
}
void section() : {}
{
<IDENTIFIER> | <TRUE> | <FALSE> | <REAL> | (<ADD> | <SUB>) section() | expr()
}
그리고 경고는 다음과 같습니다.
Warning:
Choice conflict in (...)* construct at line 233, column 14.
Expansion nested within construct and expansion following construct
have common prefixes, one of which is: "-"
Consider using a lookahead of 2 or more for nested expansion.
Parser generated with 0 errors and 1 warnings.
233 번 줄이 expr2 ()의 첫 번째 줄에 해당하는 경우
@Juan Lopes는 다음과 같이 썼습니다.
"2 + 2"를 고려하십시오. "+"는
<ADD>
atexpr2()
또는<ADD>
atsection()
?
OP는 다음과 같이 답했습니다.
Add / Sub 명령을 제거해
section()
도 여전히 동일한 문제가 발생합니다. 나는 당신이 의미하는 바를 이해하지만 그것이 문제를 일으키는 것 같지 않습니다.
@Theodore Norvell은 다음과 같이 썼습니다.
Juan이 말한 것은 전적으로 정확합니다. 그러나 변화
(<ADD> | <SUB>) section()
에section()
소개하고 새로운 문제를. 본문의 첫 번째 줄 변경 시도expr2
에 하나section() (<MUL>|<DIV>|<MOD> section())* expr2()
또는section() ((<MUL>|<DIV>|<MOD>) section())* expr2()
당신이 실제로 원하는에 따라. 그래도 작동하지 않으면 새로운 질문을하십시오. Juan이 대답했습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다