Пример #1
0
 public void Run(Ast.Ast ast)
 {
     if (ast is Exp)
     {
         var result = runExp((Ast.Exp)ast);
         Console.WriteLine(result);
     }
     else
     {
         runBlock(((Ast.Program)ast).Statements);
     }
 }
Пример #2
0
 /// <summary>
 /// ASTから、文字列表現に変換する.
 ///
 /// prettyPrintにtrueを指定すると、改行やインデントを挟んだ読みやすい表現になる
 ///
 /// BuildString(1 + 2 * 3 の AST, false) => "Add( 1 Multiply( 2 3 ) )"
 ///
 /// BuildString(1 + 2 * 3 の AST, true) =>
 ///   "Add(
 ///     1
 ///     Multiply(
 ///       2
 ///       3
 ///     )
 ///    )"
 /// </summary>
 /// <param name="ast">対象のAST</param>
 /// <param name="prettyPrint">Pretty print をするかどうか</param>
 /// <returns></returns>
 public string BuildString(Ast.Ast ast, bool prettyPrint = true)
 {
     list_ = new List <Tuple <int, string> >();
     build(0, ast);
     if (prettyPrint)
     {
         return(string.Join("\n", list_.Select(s => new string(' ', s.Item1 * 2) + s.Item2).ToArray()));
     }
     else
     {
         return(string.Join(" ", list_.Select(s => s.Item2).ToArray()));
     }
 }
Пример #3
0
        void build(int level, Ast.Ast ast)
        {
            var displayInfo = ast.GetDisplayInfo();

            if (displayInfo.Item2 == null)
            {
                add(level, displayInfo.Item1);
            }
            else
            {
                add(level, displayInfo.Item1 + "(");
                foreach (var child in displayInfo.Item2)
                {
                    build(level + 1, child);
                }
                add(level, ")");
            }
        }