/// <summary> /// 翻译代码树到C语言 /// </summary> public void startDash() { StringBuilder codeBuilder = new StringBuilder(); // 第一阶段:处理标头和宏 string stdHeadAndMacro = this.symbolMana.getMarcoContainer(); codeBuilder.Append(stdHeadAndMacro); codeBuilder.Append("// ____KAGA_STDHEADANDMACRO_DEAL_ABOVE" + Environment.NewLine + Environment.NewLine); // 第二阶段:处理全局量和函数签名 KagaTable globalKT = this.symbolMana.getGlobalTable(); foreach (string gs in globalKT.getParseTable()) { codeBuilder.Append(gs + Consta.pile_statend + Environment.NewLine); } codeBuilder.Append("// ____KAGA_GLOBALVAR_DEAL_ABOVE" + Environment.NewLine + Environment.NewLine); codeBuilder.Append("char " + Consta.switch_name + "[" + Consta.switch_max + "];" + Environment.NewLine); codeBuilder.Append("// ____KAGA_SWITCHES_DEAL_ABOVE" + Environment.NewLine + Environment.NewLine); foreach (FunctionCell fc in this.symbolMana.getFuncCellVector()) { codeBuilder.Append(fc.getSign(containLeftBrucket: false) + Consta.pile_statend); } codeBuilder.Append(Environment.NewLine + "// ____KAGA_FUNCDECLARATION_DEAL_ABOVE" + Environment.NewLine + Environment.NewLine); // 第三阶段:递归下降翻译代码树 this.pileBuilder = new StringBuilder(); codeMana.DFS( match: (x) => x != null, startNode: codeMana.getRoot(), func: (x) => pile(x), unique: false); string ss = pileBuilder.ToString(); codeBuilder.Append(ss); codeBuilder.Append("// ____KAGA_PILE_DEAL_ABOVE" + Environment.NewLine + Environment.NewLine); // 第四阶段:收尾并固化 codeBuilder.Append("// ____KAGA_EOF" + Environment.NewLine + Environment.NewLine); string test = codeBuilder.ToString(); }
/// <summary> /// 添加一张符号表 /// </summary> /// <param name="kt">待添加符号表</param> public void addSymbolTable(KagaTable kt) { this.tableContainer.Add(kt); }