Как сгенерировать и отобразить ParseTree для выражения на С# с помощью Irony?

Я хочу сгенерировать и отобразить контекстно-свободную грамматику, используя иронию, и пока я могу написать контекстно-свободную грамматику, следуя коду

 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"); 
       }

и я получаю проанализированное сообщение, так что теперь оно работает нормально, я хочу сгенерировать дерево синтаксического анализа. Как я могу это сделать?


person Uzair Arif    schedule 15.11.2014    source источник


Ответы (1)


Вам не нужно его генерировать, это сделано за вас. ParseTree содержит необходимую информацию. Следующий код выведет дерево в консоль:

public static void PrintParseTree(ParseTreeNode node, int index = 0, int level = 0)
{
    for (var levelIndex = 0; levelIndex < level; levelIndex++)
    {
        Console.Write("\t");
    }

    Console.WriteLine(node + "[" + index + "]");

    var childIndex = 0;
    foreach (var child in node.ChildNodes)
    {
        PrintParseTree(child, childIndex, level + 1);
        childIndex++;
    }
}

и использование будет PrintTree(parseTree.Root)

Дополнительную информацию см. в разделе Irony — Комплект для реализации языка/Введение.

person Erti-Chris Eelmaa    schedule 15.11.2014
comment
Да, я также делаю это, но мне нужен вывод в виде окна, и я тестирую окно сообщений, используя альтернативу рекурсии, т.е. используя цикл, но он отображает только первый узел, почему? - person Uzair Arif; 15.11.2014
comment
IronyGrammarExplorer уже делает это. Если вам интересно, как они это делают, возьмите исходный код и исследуйте. - person Erti-Chris Eelmaa; 15.11.2014