2013-11-20 7 views
2

아이어니를 사용하여 스크립팅 언어 용 파서를 만들었지 만 약간의 문제가 발생했습니다 : 어떻게 아이러니에서 EBNF 표현식을 번역합니까?EBNF를 아이러니로 번역하기

'(' [ Ident { ',' Ident } ] ')' 

는 이미

Chunk.Rule = (Ident | Ident + "," + Chunk); 
CallArgs.Rule = '(' + Chunk + ')' | '(' + ')'; 

같은 몇 가지 트릭을 시도하지만 추한 나는 그게 (그것을 시도 아직하지 않은 ...)해야하는 방식으로 작동하는 경우도 모르겠어요. 누구에게 어떤 제안이 있습니까?

편집 : 아이러니의 문서가 완전히 부족하기 때문에 이러한 도우미 메서드 (MakeStarList, MakePlusList)를 발견했지만 사용할 방법을 찾을 수 없었습니다. 아무도 단서가 있습니까?

답변

1
// Declare the non-terminals 
var Ident = new NonTerminal("Ident"); 
var IdentList = new NonTerminal("Term"); 

// Rules 
IdentList.Rule = ToTerm("(") + MakePlusRule(IdentList, ",", Ident) + ")"; 
Ident.Rule = // specify whatever Ident is (I assume you mean an identifier of some kind). 

MakePlusRule 도우미 메서드를 사용하여 일부 터미널의 1 - 또는 - 여러 항목을 정의 할 수 있습니다. 또한 자식 노드의 편리한 목록으로 목록 트리를 펼쳐 파서을 말할 것이다 목록을 나타내는 등의 단자를 표시

Ident | IdentList + "," + Ident 

다음 MakePlusRule은 기본적으로 그냥 표준 재귀 목록 - 관용구로 터미널을 제시한다 .

+0

감사합니다. 매력처럼 작동했습니다. –