LL (k)와 LR (k) 문법을 구별 할 수있는 방법이 있습니까?


12

최근 컴파일러 디자인에 대해 공부하고 있습니다. 두 가지 유형의 문법에 대해 알게되었습니다. 하나는 LL 문법이고 다른 하나는 LR 문법입니다.

또한 모든 LL 문법이 LR이고 LL 문법 인 LR 문법의 적절한 부분 집합이라는 사실도 알고 있습니다. 첫 번째는 하향식 구문 분석에 사용되고 두 번째는 상향식 구문 분석에 사용됩니다.

그러나 주어진 문법이 LL 또는 LR이라고 말할 수있는 방법이 있습니까?


3
표준 기술을 사용하여 L R ( k ) 테이블 을 생성하고 충돌이 있는지 확인하는 것은 어떻습니까? L L ( 1 )L R ( 1 ) 은 일반적으로 구문 분석에 대한 모든 표준 교과서에서 처리됩니다. L의 L ( K )L R ( K ) 기술은 약간 어렵게 찾을 수 있으며, 또한 잘 알려져있다. LL(k)LR(k)LL(1)LR(1)LL(k)LR(k)
Alex ten Brink

@AlextenBrink 마치 답을 줄 수있는 것처럼 들립니다! (환영합니다. 그리워했습니다!)
Raphael

정규 기술을 사용하여 문법이 LL인지 LR인지 확인하는 것은 옳지 만 긴 방법입니다. Aho-Lam-Sethi-Ullman의 Compilers에서 찾은 작은 방법을 찾고 있습니다.
Deb

답변:


11

LL(k)LR(k)LL(k)LR(k)그리고 테이블을 생성 할 수 있기 때문에 (입력 테이블을 구문 분석하는 데 구문 분석 테이블이 사용됨). 이 두 클래스의 경우 구문 분석 테이블을 사용하면 문법에 클래스가 있는지 여부를 즉시 확인할 수 있습니다. 이는 테이블에 오류가없는 경우에만 해당되기 때문입니다. 또한, 구문 분석 테이블이있는 경우 효율적으로 구문 분석 할 수있는 문법 클래스가 있지만 테이블이있는 경우이를 생성 할 수 없습니다.

LL(1)LR(1)SLR(1)LL(k)LR(k)

LL(k)LR(k)LL(1)kLL(k)LR(k)다항식 시간으로 실행되는지 여부 (테이블 생성은 지수 적입니다). 자세한 내용은 위의 교재를 읽으십시오. 많은 경우에 테이블의 크기가 적당하므로 테스트가 필요하지 않습니다.

kkLL(k)LR(k)LR(k)kLL(c)ck(자세한 내용은 여기 를 참조하십시오).


언어가 LR (k)인지 테스트하기 위해 다항식 시간 알고리즘의 세부 정보를 어디에서 찾을 수 있는지 알고 있습니까 (교재 구입 제외)?
user541686

2

모든 LL 문법이 LR이므로 LL이 LR의 적절한 서브 세트이므로 문법이 LL인지 확인해야합니다. 따라서 문법이 LL이면 LR이어야하지만 모든 LR은 LL이 아닙니다.

문법 G는 A-> C | D 때마다 LL iff에 있으며 다음 조건이 충족되어야합니다.

  1. First (C)와 First (D)는 분리 된 세트입니다.
  2. 비어있는 것이 First (D)에 있으면 First (C)와 Follow (A)는 분리 된 세트처럼 비어 있으며 First (C)에 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.