현재 간단한 프로그래밍 언어를위한 파서를 구축하려고합니다. 파서는 잘 생성되지만 다음 경고를 표시합니다.
Warning: Choice conflict involving two expansions at
line 238, column 7 and line 239, column 7 respectively.
A common prefix is: "(" "("
Consider using a lookahead of 3 or more for earlier expansion.
오류가 발생하는 코드는 다음과 같습니다.
void condition(): {}
{
<NOT> condition() condition_prime()
| <LPAREN> condition() <RPAREN> condition_prime()
| expression() compare_ops() expression() condition_prime()
}
void condition_prime(): {}
{
logical_ops() condition() condition_prime() | {}
}
왼쪽 재귀를 제거하기 위해 이렇게했지만 이제 경고가 발생합니다. 이 경고를 피할 수있는 방법이 있습니까?
expression()
비 터미널 을 빌드하는 코드 는 다음과 같습니다.
void expression(): {}
{
fragment() expression_prime()
}
void expression_prime(): {}
{
binary_arith_op() fragment() expression_prime() | {}
}
void fragment(): {}
{
<ID> (<LPAREN> args_list() <RPAREN>)?
| <MINUS> <ID>
| <NUM>
| <DIGIT>
| <TRUE>
| <FALSE>
| <LPAREN> expression() <RPAREN>
}
선택 충돌이 발생하는 이유는 비 터미널의 정의에 condition
3 개의 선택이 있고 두 번째와 세 번째는 모두 <LPAREN>
. 가 있기 때문이다 expression
시작할 수 있습니다 <LPAREN>
.
오류 메시지는 3 개 이상의 미리보기 사용을 제안합니다. 그러나 예측 금액을 유한 수로 변경하는 것만으로는 충분하지 않습니다. 예를 들어 17로 변경하면 condition
왼쪽 괄호 로 시작하고 그 뒤에 토큰 길이가 16 개 이상인 표현식이 나오면 충분하지 않습니다 .
구문 미리보기로 문제를 해결할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다