/// <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; }
/// <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; }
/// <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; }
/// <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; }