aug 02, 2019
admin
0
78

yacc 예제

이 작업이 완료되면 파수꾼이 충돌에 직면하면 선언을 참조하고 토큰 `+`가 연관된 상태로 선언됨에 따라 줄이기로 결정합니다. 토큰은 YACC 키워드 %right 및 %nonassoc를 사용하여 올바른 연관 또는 비연관화로 선언할 수 있습니다. 예를 들어 프로덕션 expr을 추가하면 expr `expr`을 추가한 다음 %nonassoc를 선언하면 파서가 (a&ltb&ltc)와 같은 입력에 대한 파서 오류를 반환합니다. 문법이 모호하기 때문에 이 예제에서 충돌이 발생합니다. 시프트 감소 파서는 모호한 문법을 성공적으로 구문 분석할 수 없습니다. 이러한 어려움을 극복하기 위해 YACC는 특정 모호한 문법을 사용할 수 있도록 연관도(위에서 볼 수 있음) 및 우선 순위(아래 참조)를 지정하기 위한 조항과 같은 특정 기능을 제공합니다. 또 다른 모호한 문법을 고려하십시오 : expr : expr `+` expr | expr `*` 익스프레 | `(` expr `)` | `0`|` 1`|` 2`|` 3`|` 4`|` 5`|` 6`|` 7`|` 8`|` 9` YACC에 공급할 때 경고 yacc: 4 shift/감소 충돌. 표현식 2+3+5, 2*3+5, 2+3*5 및 2*3*5는 4개의 서로 다른 교대조가 충돌 사례를 줄이는 것을 보여 주는 예입니다. 첫 번째 예에서 2+3을 읽은 후 + 연관(왜?)이 남아 있기 때문에 파서는 줄이기 작업을 수행해야 합니다. 세 번째 표현식에서 파서는 *가 +보다 우선 순위가 높기 때문에 2+3을 읽은 후 줄이기 작업을 수행하지 않아야 하지만 두 번째 표현식에서는 2*3(왜?)를 읽은 후 파서가 실제로 줄여야 합니다. 따라서 파서는 이러한 충돌을 피하기 위해 운영자의 우선 순위와 연관성을 말해야 합니다.

이러한 연산자의 우선 순위는 아래와 같이 지정할 수 있습니다: %왼쪽 `+` /* `+`는 연관 */ %왼쪽 `*` ** `*`와 연관되어 있으며 `+` 연산자 아래에 나열된 `+`보다 더 높은 우선 순위를 가지게 됩니다. 연산자의 연관성에 대한 선언은 위에서 선언한 것보다 더 높은 우선 순위를 가정하여 각 줄에 선언된 연산자로, 우선 순위가 높아짐에 따라 더 많은 순서로 이루어져야 합니다. 둘 이상의 토큰이 동일한 줄에 나열된 경우 동일한 우선 순위가 할당됩니다. %는 `+` `-` %가 `*` `*` 여기 `*`와 `/`가 같은 우선순위를 가지지만 둘 다 `+` 및 `-`보다 우선순위가 높습니다. YACC는 우선 순위 및 연관성 선언을 사용하여 교대/축소 충돌을 해결합니다. YACC는 생산에 대한 우선 순위와 연관성도 지정합니다. 핸들의 우선 순위 및 연관성은 핸들의 마지막 토큰(터미널이 아님)의 우선 순위 및 연관성입니다. YACC가 시프트/충돌 감소에 부딪히면 입력 버퍼의 토큰이 스택 위에 있는 핸들의 생산보다 더 큰 우선 순위를 가지며 스택 맨 위에 있는 핸들의 생산이 토큰보다 높은 우선 순위를 가지면 이동합니다. 프로덕션과 토큰이 동일한 우선 순위를 가지면 핸들에 해당하는 프로덕션이 연관된 상태로 남아 있고 올바른 연관이 있는 경우 이동이 줄어듭니다. (참고: 동일한 우선 순위의 경우 생산 및 토큰이 발생하고 둘 다 연관되지 않은 경우 YACC는 오류를 보고합니다.

스택 I / P 버퍼 PARSER – 액션 실행 2 + 3 * (4 + 5) $ 2 + 3 * 3 * (4 + 5) $ 시프트 $expr + 3 * (4 + 5) $ $expr 감소 + 3 * ( 4 + 5) $ SHIFT $expr + 3 * ( 4 + 5) $ SHIFT $expr + expr * (4 + 5) $ 위의 표의 마지막 구성에서 감소 시프트 감소 구성. 이 문제를 해결하려면 구문 분석기는 우선 순위 선언을 참조하고 (우선 순위가 선언되었다고 가정하면) %왼쪽 `+` `-` %왼쪽 `*` `*` `*` 토큰이 `+`보다 더 큰 우선 순위를 갖는다는 것을 발견하면 파서는 `+`를 줄이는 대신 `*`를 이동하도록 선택합니다. ”예절 + 예절”을 처리합니다.

POST CATEGORIES

Okategoriserade