산술 표현식 문법 변환


9

Theodore Norvell (1999)재귀 하강에 의한 표현 분석 기사 에서 저자는 산술 표현에 대한 다음 문법으로 시작합니다.

E --> E "+" E | E "-" E | "-" E | E "*" E | E "/" E | E "^" E | "(" E ")" | v

그것은 모호하고 왼쪽 재귀이기 때문에 꽤 나쁩니다. 따라서 왼쪽 재귀를 제거하는 것으로 시작하여 결과는 다음과 같습니다.

E --> P {B P}
P --> v | "(" E ")" | U P
B --> "+" | "-" | "*" | "/" | "^"
U --> "-"

그러나 그가 어떻게이 결과를 얻었는지 알 수 없습니다. 왼쪽 재귀를 직접 제거하려고하면 다음과 같은 방식으로 수행됩니다.

  1. Firs, 나는 한 그룹에서 재귀를 남기지 않은 프로덕션과 다른 그룹에서 다른 (왼쪽 재귀적인) 프로덕션을 그룹화합니다.

    E --> E "+" E | E "-" E | E "*" E | E "/" E | E "^" E     // L-recursive
    E --> v | "(" E ")" | "-" E
  2. 다음으로 이름을 지정하고 더 쉽게 조작 할 수 있도록 고려합니다.

    E --> E B E  // L-recursive; B stands for "Binary operator"
    E --> P  // not L-recursive; P stands for "Primary Expression"
    P --> v | "(" E ")" | U E   // U stands for "Unary operator"
    B --> "+" | "-" | "*" | "/" | "^"
    P --> "-"

    이제 처음 두 작품 만 다루어야하는데, 이제 다루기가 더 쉬워졌습니다.

  3. 나는 비 L-재귀 생산부터 (단순히하는 그 첫 두 작품을 다시 작성 P, 기본 표현)와 옵션 꼬리하여 다음 T내가 원래 생산의 나머지로 정의 적은 처음 왼쪽 재귀 비단 (즉, 그냥 B E) 다음에 Tail T있거나 비어있을 수 있습니다.

    E --> P T
    T --> B E T |

    (꼬리에 대한 빈 대안을 참고하십시오).

  4. 이 두 프로덕션은 이제 다음과 같이 EBNF로 다시 작성할 수 있습니다.

    E --> P {B E}

    이것은 저자가 얻는 것과 거의 같지만 반복 패턴 (꼬리) 안에 E대신 P있습니다. 다른 작품들도 그가 가진 것과 똑같습니다.

    P --> v | "(" E ")" | U E
    B -> "+" | "-" | "*" | "/" | "^"
    U -> "-"

    하지만 여기 에 대한 첫 번째 프로덕션 E대신에 있습니다.PP

그래서 내 질문은 : 내가 무엇을 놓치고 있습니까? autor와 동일한 형식을 얻으려면 지금 구문에서 어떤 대수 변환이 필요합니까? 에 대한 대체를 시도했지만 E루프로 연결됩니다. 에 P대한 대체 방법이 필요하다고 생각 E하지만이를 정당화 할 법적 변형은 없습니다. 마지막 누락 단계가 무엇인지 알고 있습니까?


포맷팅에 LaTeX 사용을 고려하십시오. 입문서는 여기를 참조하십시오 . ( 이 경우 LaTeX의 적합성에 대한 설명은 여기 를 참조 하십시오 .)
Raphael

답변:


8

빠진 단계 :

E --> P T
T --> B E T |

T로 E를 다시 쓰십시오.

E --> P T
T --> B P T T | 

간단히하시오 T :

E --> P T
T --> B P T | 

다음과 같습니다.

E --> P T
T --> {B P}

그리고 거기 있습니다.


1
좋은 답변 주셔서 감사합니다 :-) 이제 내가 놓친 것을 보았습니다 : 나는 다른 방향으로 소문을 냈으며 그것이 문제였습니다. 그러나 여전히 작은 조각 하나를 이해하지 못합니다. Ts를 하나로 안전하게 안전하게 병합 할 수 있다는 것을 어떻게 알 수 T있습니까? 그것에 대한 규칙이 있습니까? (
어쩌면

BTW 왜이 게시물이 여기 cstheory.sx에서 옮겨졌으며 차이점은 무엇입니까? 앞으로 실수를 피하고 싶습니다.
SasQ

2
@SasQ CSTheory는 이론적 인 컴퓨터 과학에 대한 연구 수준의 질문에만 해당됩니다. 자세한 내용은 CSTheory의 FAQ를 참조하십시오.
Juho

1
@SasQ : 은 생성 하므로 됩니다. 더 일반적으로 모든 언어에 대해 입니다 . 빈 단어 을 오른쪽으로 사용하는 것이 중요합니다. 와 같이 모든 문법 조각에는 적용되지 않습니다 . TxTTεxTxTεLL=LLεL+L+L+
Raphael

@Raphael : 그것은 dem 등식 규칙과 관련이 *있습니까? 나는 "Dragon Book"(3.3, p.91)에서을 보았다 x** = x*. 당신이 사용한 것과 같은 규칙입니까?
SasQ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.