2016-11-26 7 views
1

나는 간단한 문법을 ​​가지고있다. 이 각각의 R 중첩 R. 에 의해 재귀 문법을 구성 할 수있다 때문에 내가 직면하고 문제는 다음과 같습니다문맥 자유 문법을 Java로 표현하는 방법은 무엇입니까?</p> <pre><code>R --> R and R | R or R | atom </code></pre> <p>우리가 가진 유일한 터미널 <em>원자</em>입니다 :

  1. 어떻게 재귀를 다루는?
  2. 3 가지 규칙 중 하나를 사용하여 해결할 수있는 Java 클래스 R을 작성하는 방법은 무엇입니까?

이 문법을 Java 클래스로 어떻게 표현 하시겠습니까?

+0

당신이 묻는 것이 명확하지 않습니다. 파서를 작성하는 방법? –

+0

이 문법에 대한 파서가 이미 있습니다. 내 목표는이 문법에 대한 API를 작성하는 것이므로 각 규칙을 OOP로 나타내야합니다. – user840718

+0

API는'parse()'이거나, 아마도 파스 트리 노드들의 집합이다. 네가 묻고있는 것이 불분명하다. – EJP

답변

1

가장 쉬운 방법은 모든 규칙을 단일 선택으로 정규화 한 다음 배열의 배열로 표시하는 것입니다.

먼저 우리는 문법의 각 "원자"(토큰)에 고유 코드를 할당합니다. 그런 다음

이 규칙은 모든 예컨대

LHS --> RHS1 RHS2 ... RHSn 

으로 정상화해야한다, 규칙로부터 : A -> B | c는 a -> b 및 a -> c의 두 규칙으로 정규화되어야합니다. kleene start 또는 plus와 같은 다른 멋진 표식 EBNF 장치가있는 경우에도이를 정규화합니다.

이제 K 규칙이 있습니다. K 개의 슬롯을 가진 배열을 정의 할 수 있습니다. 각 슬롯에는 하나의 규칙이 있습니다. 룰 슬롯은 한 쌍, 즉 LHS와 해당 규칙에 대한 크기 n의 배열을 보유합니다. (더 쉽게 : 룰 슬롯은 크기가 n + 1이고, 가장 왼쪽의 요소 인덱스 0은 LHS, 인덱스 1은 RHS1 등).

이제 Java로 표현 된 문법을 사용하게되었습니다.

가 [재귀는하지의 표현, 문법의 의미 속성입니다.]

대안 : 당신이 BNF 클래식 파서를 구축 할 경우 (결국, (E) BNF도 문법을 가지고) 당신이 할 수있는 파서를 사용하여 BNF를 구문 분석하고이를 위해 트리를 작성하십시오. 그것은 분명히 표현이기도합니다. 그것은 처리 할 배열의 배열처럼 편리하지 않습니다.