2011-03-15 5 views
4

JavaCUP 명세를 작성해야하며 EBNF 문법이 있습니다. 그러나, 나는 둘 사이의 변환 방법을 모른다. 기본 아이디어를 들었지만 변경해야하는 부분, "단말기"등이 무엇인지 이해하지 못했습니다.EBNF 문법을 문맥 자유 문법으로 변환

누구든지 다른 사람으로 전환하는 방법이나 어딘가에 있을지 설명 할 수 있습니까? 어디에서 읽을 수 있습니까?

답변

4

EBNF 문법은 일반 BNF와 비슷하지만 정규식 연산자와 비슷한 몇 가지 추가 기능이 구문 설탕과 비슷합니다. 당신이 당신의 문법을 보여주지 않았기 때문에, 난 단지 당신이 정상 BNF로 변환 desugar하기 위해 필요한 부분에서 추측 할 수 있지만, 여기 (JavaCUP 같은 LALR 발생기에 대한) 가장 일반적입니다 :

B* becomes Bstar, defined as Bstar ::= epsilon; Bstar ::= Bstar B 
B+ becomes Bplus, defined as Bplus ::= B; Bplus ::= Bplus B 
B? becomes Bquestion, defined as Bquestion ::= epsilon; Bquestion ::= B 
B | C becomes BorC, defined as BorC ::= B; BorC ::= C 

epsilon 식별자 여기 파서 생성기는 빈 문자열을 나타냅니다.

+0

X : = (A | B)가 trwo 규칙이됩니다. X : = A 및 X : = B –

+0

@Ira : 제안 해 주셔서 감사합니다 .- 넣어드립니다. –

+0

@Jeremiah : 저는 네가 그렇게했다고 생각하지 마라. 내 변환은 EBNF 연산자 "|"를 제거합니다. 두 개의 분리 된 문법 규칙으로 줄임으로써 귀하의 recasting 정의 "|" "|"의 관점에서; 그게 어떻게 도움이됩니까? –

관련 문제