2014-11-15 3 views
0

내가 생성 및 디스플레이 문맥 자유 문법 아이러니를 사용하여 지금까지 나는이 코드를Irony를 사용하여 C#의 표현식에 대해 ParseTree를 생성하고 표시하는 방법은 무엇입니까?

public ExpressionGrammar() 
      { 
        //// 1. Terminals 
        Terminal number = new NumberLiteral("number"); 
        Terminal identifier = new IdentifierTerminal("identifier"); 

        //// 2. Non-terminals 
        NonTerminal Stmt = new NonTerminal("Stmt"); 
        NonTerminal Dec = new NonTerminal("Dec"); 
        NonTerminal Datattype = new NonTerminal("Datatype"); 
        NonTerminal Def = new NonTerminal("Def"); 
        NonTerminal Var = new NonTerminal("Var"); 
        NonTerminal Const = new NonTerminal("Const"); 
        this.Root = Stmt; 
        ////3. BNF Rules 
        Stmt.Rule = "{"+Dec+"}"; 
        Dec.Rule = Datattype + Def + ";"; 
        Def.Rule = identifier | identifier + "=" + number; 

        //MarkPunctuation(""); ; 
        Datattype.Rule = ToTerm("int") | "char" | "float"; 
} 

에 따라 그리고 내 form_load 이벤트 문맥 자유 문법을 쓸 수 있어요

 ExpressionGrammar ex = new ExpressionGrammar(); 
     //Grammar grammar = new ExpressionGrammar(); 
     Parser parser = new Parser(ex); 
     ParseTree parseTree = parser.Parse("{int a=5;}"); 
     if (!parseTree.HasErrors()) 
     { 
      //foreach (string p in parseTree.) { } 
      MessageBox.Show(parseTree.Status.ToString()); 
      // ParseTreeNodeList ls = new ParseTreeNodeList(); 
      //ls.Add(parseTree.Root); 

     } 
     else 
     { 
      MessageBox.Show("Error in parsing"); 
     } 

하고 싶어 이제 파싱 트리를 생성하고 싶습니다. 내가 어떻게 할 수 있니?

답변

0

생성하지 않아도됩니다. ParseTree에는 필요한 정보가 들어 있습니다. 이 다음 코드는 콘솔에 트리를 인쇄합니다 :

public void PrintTree(ParseTreeNode node, int level) 
{ 
    for(int i = 0; i < level; i++) 
     Console.Write(" "); 

    Console.WriteLine(node); 

    foreach (ParseTreeNode child in node.ChildNodes) 
     PrintTree(child, level + 1); 
} 

및 사용은

PrintTree(parseTree.Root, 0) 자세한 내용은 Irony - Language Implementation Kit/Introduction를 참조 할 것.

+0

예 또한이 작업을 수행하고 있지만 창 형식으로 출력하고 싶습니다. 반복을 사용하여 메시지 상자에서 테스트하고 있습니다. 즉 루프를 사용하지만 첫 번째 노드 만 표시하는 이유는 무엇입니까? – user2549568

+0

IronyGrammarExplorer 이미 그것을 않습니다. 그들이 어떻게하는지 관심이 있다면, 소스를 얻고 탐색하십시오. –