문제

나는 교대/감소 오류를 멀리 유지하고 있습니다. 이제 마침내 나는 내 경기를 만났다고 생각합니다.

Int[] a
a[0] = 1

문제는 int []가 정의됩니다

Type OptSquareBrackets

0]은 다음과 같이 정의됩니다

Var | Var '[' expr ']'

var 및 type 둘 다 유효한 변수 인 var로 정의됩니다. [a-zA-Z][a-zA-Z0-9_]. 더미 토큰을 추가하는 것 외에도 (: **Decl** Type OptSquareBrackets 대신) 충돌이 없도록 이것을 쓰는 방법이 있습니까? 이 하나의 규칙에서 나는 1 교대/감소와 1 경고 감소/감소를 얻는다.

도움이 되었습니까?

해결책

새 토큰을 정의 할 수 있습니까?

VarLBracket [a-zA-Z][a-zA-Z0-9_]*\[

따라서 선언을 정의하십시오

Type | VarLBracket ']';

할당 대상을 다음과 같이 정의하십시오

Var | VarLBracket expr ']';

다른 팁

]가 선언에만 사용되며 다른 곳은 [var]를 사용할 것이므로 []로 LEX 규칙을 만듭니다.

기술적 으로이 문제는 문법을 실제로 구문이 다르지 않은 의미 론적 의미로 묶으려고 노력하는 것입니다.

ISTM은 유형과 표현을 모두 설명하는 단일 문법 구성이 필요합니다. 특히 구문 차이가없는 경우 문법이 아닌 코드를 구별하십시오. YACC를 컴파일러 생성기라고하지만 가장 적은 사실은 아닙니다. 그것은 단지 파서를 만듭니다.

그것을 인식하고 [] 터미널 기호는 문제를 해결하고 일을 시작하는 더 쉬운 방법 일 수 있습니다. YACC는 모호한 문법에 능숙하지 않으며 따라야 할 경로에 대한 초기 결정을 내려야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top