연산자의 왼쪽 연관을 유지하면서 문법의 왼쪽 재귀 제거


13

이 운동에 문제가 있습니다.

G를 λ- 미적분에 대한 다음과 같은 모호한 문법으로하자.

E → v | λv.E | EE | (E)

여기서 E는 단일 비단 말 기호이고, λv.E는 변수 v를 E로 나타낸 추상화를 나타내고, EE는 응용을 나타냅니다.

  1. LL (1) 문법 G '를 정의하여 L (G') = L (G)이고 G의 모호성은 다음과 같은 일반적인 규칙을 적용하여 해결됩니다.
    1. 추상화는 올바른 연관성입니다.
    2. 응용 프로그램은 연관되어 있습니다.
    3. 응용 프로그램은 추상화보다 우선 순위가 높습니다.
  2. G '에 대한 LL (1) 구문 분석 테이블과 문자열을 구문 분석 할 때 얻은 구문 분석 트리를 표시하십시오 λv1. λv2. v1v2v1.

다음 문법을 통해 모호성 설정 우선 순위 및 연관성을 제거했습니다.

E -> EF | F
F -> λv.G | G
G -> (E) | v

생산 E -> EF은 재귀 적이므로 LL (1)이 아닙니다 . 그러나 내가 얻은 생산에서 왼쪽 재귀를 제거하면 다음과 같습니다.

E -> FE¹
E¹-> FE¹ | ɛ
F -> λv.G | G
G -> (E) | v

요구 사항 1.2를 준수하지 않습니다.

인터넷에서 해결책을 찾았지만 왼쪽 연관성을 유지하는 왼쪽 재귀를 제거하는 것이 불가능한 것 같습니다.

그러나이 연습은 몇 년 전에 컴파일러 시험에 나타 났으므로 정답이 있어야합니다.

도와 주셔서 감사합니다.

답변:


11

왼쪽 연관성과 LL (1) 구문 분석의 호환성

컨텍스트 프리 (CF) 구문을 사용하는 데있어 주요 불일치가 발생했습니다. 사람들은 문법을 선택하여 구문 분석 트리가 특히 응용 프로그램 과 같은 비 연관 연산자의 경우 의미에 가까운 문장의 의도 된 구조를 반영하도록 합니다 . 이것은 언어학에서 CF 문법의 원래 의도와 거의 같습니다. 그러나 동시에 일부 유형의 문법 만 허용하는 구문 분석 기술로 제한됩니다.

실제로 구문 분석 트리가 연산자의 왼쪽 연관성을 반영하는 경우 구문 분석 트리의 최상위 응용 프로그램 노드는 반드시 구문 분석되지 않은 연속 응용 프로그램의 가장 오른쪽 항을 추가하기 때문에 문법은 반드시 왼쪽 재귀입니다. 따라서 LL 파싱은 의문의 여지가 없습니다. 네 말이 맞아

이 중에서 두 가지 방법이 있습니다. 하나는 파서에 의존하여 나중에 처리 단계 (예 : 람다 표현 감소)에 사용될 rigth "parse-tree"를 제공하지 않습니다. 이는 구문 분석 트리에서 구축 할 수 있지만 구조가 다른 AST (Abstract Syntax Trees) 개념으로 이어집니다.

다른 해결책은 CF 문법을 받아들이고 그에 따라 구문 분석하는보다 일반적인 구문 분석 기법을 사용하는 것입니다. 일반적인 CF 파서는 잘 개발 된 기술입니다 (그리고 LL이 왜 그렇게 인기가 있는지 궁금하지 않습니다).

이러한 모순되는 요구 사항에 대한 적절한 답변으로 간주 될 수있는 것이 무엇인지 모르겠습니다.

내가해야 할 일은 요구 사항과 모순된다는 것을 보여줍니다. 연관성 및 우선 순위 제약 조건을 충족하는 첫 번째 문법을 제공 한 다음 구문 분석을 위해 문법을 LL (1) 문법으로 변환합니다.

일지나 시험에 어떤 것이 나왔다는 사실이 그것이 정확하다는 전적인 보증은 아닙니다. 그리고 나도 틀렸을 수도 있지만 ... 문제에 대한 내 지식 외에도 검사를했습니다.

이 특정 예에 대하여

이것은 당신이 제안하는 첫 번째 문법이 정확하지 않은 것 같습니다. λu.λv.v를 생성하는 방법이 없습니다.

알아야 할 한 가지 트릭은 우선 순위가 가장 낮은 (추상) 연산자 (여기서는 추상화 또는 응용 프로그램)로 시작하는 것입니다. 산술 연산 식과 동일합니다.


자세한 의견에 감사드립니다. 네 말이 맞아, 나는 첫 번째 문법으로 잘못했다. 이것도 고마워. 그때 교수에게 물어 볼게요.
Marco DallaG

관심이 있다면 인형 용 문법 디자인에 대한 작은 메모와 함께 답을 추가 할 수 있습니다 (나도). 또한, 교수님의 의견을 알려주세요.
babou

교수가이 질문에 대답하면 스레드를 업데이트하겠습니다. 어쨌든 문제가되지 않으면 더 많은 정보를 자유롭게 추가하십시오. 물론 감사합니다. 도와 주셔서 감사합니다
Marco DallaG

@MarcoDallaG Pierce의 TAPL 작업을 할 때이 문제가 발생했습니다. 교수님이이 답변과 다른 말을 했습니까? :)
lcn

0

내 시도 :

E  -> A | λv.E
A  -> FA'
A' -> A | ɛ
F  -> (E) | v

이 문법은 LL (1)이며 필수 특성을 준수해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.