Exemplo n.º 1
0
 /// <summary>
 /// 1つのソースコード全体からなる<see cref="KecaknoahAst"/>をプリコンパイルします。
 /// </summary>
 /// <param name="ast">対象の<see cref="KecaknoahAst"/></param>
 /// <returns>プリコンパイル結果</returns>
 public KecaknoahSource PrecompileAll(KecaknoahAst ast)
 {
     var result = new KecaknoahSource();
     current = result;
     foreach (var i in ast.RootNode.Children)
     {
         if (i is KecaknoahClassAstNode)
         {
             result.classes.Add(PrecompileClass(i as KecaknoahClassAstNode));
         }
         else if (i is KecaknoahFunctionAstNode)
         {
             result.methods.Add(PrecompileFunction(i as KecaknoahFunctionAstNode));
         }
         else if (i is KecaknoahUseAstNode)
         {
             result.uses.Add((i as KecaknoahUseAstNode).Target);
         }
         else
         {
             throw new InvalidOperationException("トップレベルにはクラスとメソッドとuse文以外おけません");
         }
     }
     current = null;
     return result;
 }
Exemplo n.º 2
0
 /// <summary>
 /// 指定された<see cref="KecaknoahLexResult"/>を式として解析します。
 /// </summary>
 /// <param name="lex">字句解析の結果</param>
 /// <returns>構築されたAST</returns>
 public KecaknoahAst ParseAsExpression(KecaknoahLexResult lex)
 {
     var result = new KecaknoahAst(lex.SourceName);
     try
     {
         var q = new Queue<KecaknoahToken>(lex.Tokens);
         var top = ParseExpression(q);
         if (q.Count != 0) throw new KecaknoahParseException(q.Dequeue().CreateErrorAt("解析されないトークンが残っています。"));
         result.RootNode = top;
         result.Success = true;
     }
     catch (KecaknoahParseException e)
     {
         result.RootNode = null;
         result.Success = false;
         result.Error = e.Error;
     }
     return result;
 }
Exemplo n.º 3
0
 /// <summary>
 /// 指定された<see cref="KecaknoahLexResult"/>を元にASTを構築します。
 /// </summary>
 /// <param name="lex">字句解析の結果</param>
 /// <returns>構築されたAST</returns>
 public KecaknoahAst Parse(KecaknoahLexResult lex)
 {
     var result = new KecaknoahAst(lex.SourceName);
     try
     {
         var top = ParseFirstLevel(new Queue<KecaknoahToken>(lex.Tokens));
         result.RootNode = top;
         result.Success = true;
     }
     catch (KecaknoahParseException e)
     {
         result.RootNode = null;
         result.Success = false;
         result.Error = e.Error;
     }
     return result;
 }
Exemplo n.º 4
0
 /// <summary>
 /// 式からなる<see cref="KecaknoahAst"/>をプリコンパイルします。
 /// </summary>
 /// <param name="ast">対象の<see cref="KecaknoahAst"/></param>
 /// <returns>プリコンパイル結果</returns>
 public KecaknoahIL PrecompileExpression(KecaknoahAst ast)
 {
     var result = new KecaknoahIL();
     result.PushCodes(PrecompileExpression(ast.RootNode));
     return result;
 }