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 --> "-"
그러나 그가 어떻게이 결과를 얻었는지 알 수 없습니다. 왼쪽 재귀를 직접 제거하려고하면 다음과 같은 방식으로 수행됩니다.
Firs, 나는 한 그룹에서 재귀를 남기지 않은 프로덕션과 다른 그룹에서 다른 (왼쪽 재귀적인) 프로덕션을 그룹화합니다.
E --> E "+" E | E "-" E | E "*" E | E "/" E | E "^" E // L-recursive E --> v | "(" E ")" | "-" E
다음으로 이름을 지정하고 더 쉽게 조작 할 수 있도록 고려합니다.
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 --> "-"
이제 처음 두 작품 만 다루어야하는데, 이제 다루기가 더 쉬워졌습니다.
나는 비 L-재귀 생산부터 (단순히하는 그 첫 두 작품을 다시 작성
P
, 기본 표현)와 옵션 꼬리하여 다음T
내가 원래 생산의 나머지로 정의 적은 처음 왼쪽 재귀 비단 (즉, 그냥B E
) 다음에 TailT
이 있거나 비어있을 수 있습니다.E --> P T T --> B E T |
(꼬리에 대한 빈 대안을 참고하십시오).
이 두 프로덕션은 이제 다음과 같이 EBNF로 다시 작성할 수 있습니다.
E --> P {B E}
이것은 저자가 얻는 것과 거의 같지만 반복 패턴 (꼬리) 안에
E
대신P
있습니다. 다른 작품들도 그가 가진 것과 똑같습니다.P --> v | "(" E ")" | U E B -> "+" | "-" | "*" | "/" | "^" U -> "-"
하지만 여기 에 대한 첫 번째 프로덕션
E
대신에 있습니다.P
P
그래서 내 질문은 : 내가 무엇을 놓치고 있습니까? autor와 동일한 형식을 얻으려면 지금 구문에서 어떤 대수 변환이 필요합니까? 에 대한 대체를 시도했지만 E
루프로 연결됩니다. 에 P
대한 대체 방법이 필요하다고 생각 E
하지만이를 정당화 할 법적 변형은 없습니다. 마지막 누락 단계가 무엇인지 알고 있습니까?