Parser Parser_Obj = new Parser();
Parser_Obj.Parse("Example.cpp");
IR_V5_Generete_DOT IR = new IR_V5_Generete_DOT();
public void Parse(string Src)
DBG.ENTER("Parse(Srs = \"" + Src + "\")");
void Generate_Tokens_List()
DBG.ENTER("Generate_Tokens_List()");
Tokenizer T = new Tokenizer();
Token_List = T.Create_Token_List(Src);
DBG.Print("\n\n---------------------\n\n");
string Src = "int main()\n" +
"DBG.Print(\"No problem!!!\");\n"+
string Src = "int Data_1;\n" +
"double Data_3 = 3;\n\n" +
"int main(int a, int b, float X, double Y2)\n"+
" double Data_B = 25.45;\n\n" +
DBG.ENTER("Parse_Glb_Scope()");
IR.Next_Sentence_in_global_scope();
Token T = Get_Next_Token();
int Index_Next_Token = 0;
DBG.ENTER("Get_Next_Token()");
Token Ret = Token_List[Index_Next_Token];
DBG.RETURN("<- Type = " + Ret.Type + "; Value = \"" + Ret.Value + "\"");
DBG.ENTER("Back_Token()");
DBG.ENTER("Parse_Sentence()");
Token T = Get_Next_Token();
if (T.Type == T_Type.BuildInType) Parse_Sentence_Type();
else if(T.Type == T_Type.ControlKeyWord) Parse_Sentence_Control();
else if(T.Value == "class") Parse_Sentence_Class();
else if(T.Value == "struct") Parse_Sentence_Struct();
else if(T.Value == "{") Parse_Block();
DBG.Src_ERROR_TRAP("Undef type of Sentence - Token.Type = " + T.Type + "; Token.Value =" + T.Value);
DBG.ENTER("Parse_Block()");
Token T = Get_Next_Token();
void Parse_Sentence_Type()
DBG.ENTER("Parse_Sentence_Type()");
Token T = Get_Next_Token();
case ";": Parse_Var(); break;
case "=": Parse_Var_w_Init(); break;
case "(": Parse_Definite_Function(); break;
DBG.Src_ERROR_TRAP("ERROR in Parse_Sentence_Type()"); break;
void Parse_Sentence_Control()
DBG.ENTER("Parse_Sentence_Control()");
Token T = Get_Next_Token();
case "if": Parse_Control_IF(); break;
case "goto": Parse_Control_GOTO(); break;
case "return": Parse_Control_RETURN(); break;
case "switch": Parse_Control_SWITCH(); break;
case "do": Parse_Control_DO(); break;
case "while": Parse_Control_WHILE(); break;
case "for": Parse_Control_FOR(); break;
DBG.Src_ERROR_TRAP("ERROR in Parse_Sentence_Control()"); break;
DBG.ENTER("Parse_Control_IF()");
Token T1 = Get_Next_Token();
Token T2 = Get_Next_Token();
Token T3 = Get_Next_Token();
Token T4 = Get_Next_Token();
Token T5 = Get_Next_Token();
IR.CMD_IF(T2.Value, T3.Value, T4.Value);
Token T6 = Get_Next_Token();
void Parse_Control_GOTO()
DBG.ENTER("Parse_Control_GOTO()");
Token T1 = Get_Next_Token();
Token T2 = Get_Next_Token();
void Parse_Control_RETURN()
DBG.ENTER("Parse_Control_RETURN()");
Token T1 = Get_Next_Token();
Token T2 = Get_Next_Token();
IR.RETURN_w_Value(T1.Value);
void Parse_Control_SWITCH()
DBG.ENTER("Parse_Control_SWITCH()");
Token T = Get_Next_Token();
IR.CMD_SWITCH_START(T.Value);
DBG.Src_ERROR_TRAP("ERROR in Parse_Control_SWITCH() - free switch");
if(T.Value == "case" || T.Value == "default" || T.Value == "}")
else if(T.Value == "default")
DBG.Src_ERROR_TRAP("ERROR in Parse_Control_SWITCH() - \"case\", after \"default\"");
DBG.Src_ERROR_TRAP("ERROR in Parse_Control_SWITCH() - \"default\", after \"default\"");
DBG.Src_ERROR_TRAP("ERROR in Parse_Control_SWITCH()");
Token Op1 = Get_Next_Token();
Token CmpSign = Get_Next_Token();
Token Op2 = Get_Next_Token();
IR.DO_END(Op1.Value, CmpSign.Value, Op2.Value);
void Parse_Control_WHILE()
Token Op1 = Get_Next_Token();
Token CmpSign = Get_Next_Token();
Token Op2 = Get_Next_Token();
IR.WHILE_START(Op1.Value, CmpSign.Value, Op2.Value);
if(IR.GetType().Name == "IR_V2_Generete_CPP")
Parse_Control_FOR_destructured();
void Parse_Control_FOR_V2()
DBG.Print("\n\n// FOR-loop START ---------------------");
DBG.Print("\n{ // isolate variables\n");
Token Op1 = Get_Next_Token();
Token CmpSign = Get_Next_Token();
Token Op2 = Get_Next_Token();
IR.WHILE_START(Op1.Value, CmpSign.Value, Op2.Value);
int TMP1 = Index_Next_Token;
int TMP2 = Index_Next_Token;
DBG.Print("\n// FOR-loop END ---------------------");
void Parse_Control_FOR_destructured()
Token Op1 = Get_Next_Token();
Token CmpSign = Get_Next_Token();
Token Op2 = Get_Next_Token();
IR.FOR_START(Op1.Value, CmpSign.Value, Op2.Value);
int TMP1 = Index_Next_Token;
int TMP2 = Index_Next_Token;
void Parse_Sentence_Class()
DBG.ENTER("Parse_Sentence_Class()");
void Parse_Sentence_Struct()
DBG.ENTER("Parse_Sentence_Struct()");
DBG.ENTER("Parse_Var()");
Token Var_Type = Get_Next_Token();
Token Var_Name = Get_Next_Token();
IR.Def_Variable(Var_Type.Value, Var_Name.Value);
DBG.ENTER("Parse_Var_w_Init()");
Token Var_Type = Get_Next_Token();
Token Var_Name = Get_Next_Token();
Token Var_Init_Value = Get_Next_Token();
IR.Def_Variable(Var_Type.Value, Var_Name.Value, Var_Init_Value.Value);
void Parse_Definite_Function()
DBG.ENTER("Parse_Definite_Function()");
Token Ret_Type = Get_Next_Token();
Token Func_Name = Get_Next_Token();
IR.Define_Function_START(Func_Name.Value, Ret_Type.Value);
Parse_in_Function_Body();
DBG.ENTER("Parse_Arg_List()");
Token T = Get_Next_Token();
Token Param_Type = Get_Next_Token();
Token Param_Name = Get_Next_Token();
IR.Function_NextArg(Param_Name.Value, Param_Type.Value);
IR.Function_ArgList_END();
void Parse_in_Function_Body()
DBG.ENTER("Parse_in_Function_Body()");
Token T = Get_Next_Token();
public void Next_Sentence_in_global_scope()
DBG.ENTER("IR_V0.Next_Sentence_in_global_scope()");
DBG.Print("\n\nNext sentence in GLOBAL SCOPE\n", ConsoleColor.Yellow);
public void Def_Variable(string Type, string Name)
DBG.ENTER("IR_V0.Def_Variable(T, N)");
DBG.Print("\n\nParse_Var()\n");
DBG.Print("\n Type = " + Type);
DBG.Print("\n Name = \"" + Name + "\"\n");
public void Def_Variable(string Type, string Name, string InitValue)
DBG.ENTER("IR_V0.Def_Variable(T, N, V)");
DBG.Print("\n\nParse_Var_w_Init()\n");
DBG.Print("\n Type = " + Type);
DBG.Print("\n Name = \"" + Name + "\"");
DBG.Print("\n Init_Value = " + InitValue + "\n");
public void CMD_IF(string Op1, string Sign, string Op2)
DBG.Print("\n\n\nIF start\n");
DBG.Print("\n Cond = " + Op1 + Sign + Op2);
DBG.Print("\n\n\nELSE-branch\n");
public void GOTO(string Lb_Name)
DBG.Print("\ngoto " + Lb_Name + ";");
public void RETURN_VOID()
public void RETURN_w_Value(string Value)
DBG.Print("\nreturn " + Value + ";");
public void Define_Function_START(string Func_Name, string Ret_Type)
DBG.Print("\n\nParse_Definite_Function()");
DBG.Print("\n Ret_Type = " + Ret_Type);
DBG.Print("\n Func_Name = " + Func_Name + "\n");
public void Def_Function_END()
DBG.Print("\nFunction definit is end");
public void Function_NextArg(string Param_Name, string Param_Type)
DBG.Print("\n\nParam #"+ Param_Cnt + ":");
DBG.Print("\n Type = " + Param_Type);
DBG.Print("\n Name = \"" + Param_Name + "\"\n");
public void Function_ArgList_END()
DBG.Print("\nArgList is end");
public void CMD_SWITCH_START(string SwitchValue)
DBG.Print("\nCMD_SWITCH_START, Param = " + SwitchValue);
public void SWITCH_CASE(string CaseValue)
DBG.Print("\nSWITCH_CASE, Param = " + CaseValue);
public void BREAK_IN_SWITCH()
DBG.Print("\nBREAK_IN_SWITCH");
public void SWITCH_DEFAULT()
DBG.Print("\nSWITCH_DEFAULT");
DBG.Print("\nSWITCH_END");
class IR_V1_Generete_DEPL
public void Next_Sentence_in_global_scope()
DBG.ENTER("IR_V1.Next_Sentence_in_global_scope()");
for(int i = 0; i < TabLevel; i++)
public void Def_Variable(string Type, string Name)
DBG.ENTER("IR_V1.Def_Variable(T, N)");
DBG.Print("\n" + TabSpaser() + Name + " " + ConvertType(Type));
public void Def_Variable(string Type, string Name, string InitValue)
DBG.ENTER("IR_V1.Def_Variable(T, N, V)");
if(Type == "double" || Type == "float")
if(InitValue.Contains('.') == false)
InitValue = InitValue + ".0";
DBG.Print("\n" + TabSpaser() + Name + " = " + InitValue);
public void Define_Function_START(string FuncName, string RetutnType)
DBG.ENTER("IR_V1.Define_Function_START()");
DBG.Print(TabSpaser() + "ФУНКЦІЯ " + FuncName + "(");
public void Function_NextArg(string Param_Name, string Param_Type)
DBG.ENTER("IR_V1.Function_NextArg()");
DBG.Print(Param_Name + " " + ConvertType(Param_Type));
DBG.Print(", " + Param_Name + " " + ConvertType(Param_Type));
public void Function_ArgList_END()
DBG.ENTER("IR_V1.Function_ArgList_END()");
string Type_in_DePL = ConvertType(RT);
DBG.Print(") " + Type_in_DePL);
DBG.Print("\n" + TabSpaser());
public void Def_Function_END()
DBG.ENTER("IR_V1.Def_Function_END()");
DBG.Print("\n" + TabSpaser());
DBG.Print("\n" + TabSpaser() + "ФІНІШ");
public void RETURN_w_Value(string Value)
DBG.ENTER("IR_V1.RETURN_w_Value()");
DBG.Print("\n" + TabSpaser() + "ВЕРНУТИСЬ " + Value);
public void RETURN_VOID()
DBG.ENTER("IR_V1.RETURN_VOID()");
DBG.Print("\n" + TabSpaser() + "ВЕРНУТИСЬ");
public void GOTO(string Lb_Name)
DBG.ENTER("IR_V1.GOTO()");
DBG.Print("\n --------------------- PROBLEM!!! ---------------------------");
DBG.Print("\n -------------- DePL not supported \"goto\" -------------------");
public void CMD_IF(string Op1, string CmpSign, string Op2)
DBG.ENTER("IR_V1.CMD_IF()");
DBG.Print("\n" + TabSpaser());
DBG.Print("\n" + TabSpaser() + "ЯКЩО " + Op1 + " " + CmpSign + " " + Op2);
DBG.Print("\n" + TabSpaser());
DBG.ENTER("IR_V1.CMD_ELSE()");
DBG.Print("\n" + TabSpaser());
DBG.Print("\n" + TabSpaser() + "ІНАКШЕ");
DBG.Print("\n" + TabSpaser());
DBG.ENTER("IR_V1.CMD_IF_END()");
DBG.Print("\n" + TabSpaser());
DBG.Print("\n" + TabSpaser() + "КІНЕЦЬ");
DBG.Print("\n" + TabSpaser());
string ConvertType(string type)
DBG.ENTER("IR_V1.ConvertType()");
case "void" : return "void";
case "int" : return "int";
case "float" : return "double";
case "double": return "double";
public void CMD_SWITCH_START(string SwitchValue)
DBG.Print("\n" + TabSpaser() + "ПЕРЕМИКАЧ " + SwitchValue);
public void SWITCH_CASE(string CaseValue)
DBG.Print("\n" + TabSpaser() + "ВАРIАНТ " + CaseValue);
public void BREAK_IN_SWITCH()
DBG.Print("\n" + TabSpaser() + "BREAK");
public void SWITCH_DEFAULT()
DBG.Print("\n" + TabSpaser() + "IНШЕ");
DBG.Print("\n" + TabSpaser() + "КIНЕЦЬ\n");
public void Next_Sentence_in_global_scope()
DBG.ENTER("IR_V2.Next_Sentence_in_global_scope()");
for(int i = 0; i < TabLevel; i++)
public void Def_Variable(string Type, string Name)
DBG.ENTER("IR_V2.Def_Variable(T, N)");
DBG.Print("\n" + TabSpaser() + Type + " " + Name + ";");
public void Def_Variable(string Type, string Name, string InitValue)
DBG.ENTER("IR_V2.Def_Variable(T, N, V)");
DBG.Print("\n" + TabSpaser() + Type + " " + Name + " = " + InitValue + ";");
public void Define_Function_START(string FuncName, string RetutnType)
DBG.ENTER("IR_V1.Define_Function_START()");
DBG.Print(TabSpaser() + RetutnType + " " + FuncName + "(");
public void Function_NextArg(string Param_Name, string Param_Type)
DBG.ENTER("IR_V1.Function_NextArg()");
DBG.Print(Param_Type + " " + Param_Name);
DBG.Print(", " + Param_Type + " " + Param_Name);
public void Function_ArgList_END()
DBG.ENTER("IR_V1.Function_ArgList_END()");
DBG.Print(")\n{" + TabSpaser());
public void Def_Function_END()
DBG.ENTER("IR_V1.Def_Function_END()");
DBG.Print("\n" + TabSpaser() + "}");
public void RETURN_w_Value(string Value)
DBG.ENTER("IR_V1.RETURN_w_Value()");
DBG.Print("\n" + TabSpaser() + "return " + Value + ";");
public void RETURN_VOID()
DBG.ENTER("IR_V1.RETURN_VOID()");
DBG.Print("\n" + TabSpaser() + "return;");
public void GOTO(string Lb_Name)
DBG.ENTER("IR_V1.GOTO()");
DBG.Print("\n" + TabSpaser() + "goto " + Lb_Name + ";");
public void CMD_IF(string Op1, string CmpSign, string Op2)
DBG.ENTER("IR_V1.CMD_IF()");
DBG.Print("\n" + TabSpaser());
DBG.Print("\n" + TabSpaser() + "if(" + Op1 + " " + CmpSign + " " + Op2 + ")");
DBG.Print("\n" + TabSpaser() + "{");
DBG.ENTER("IR_V1.CMD_ELSE()");
DBG.Print("\n" + TabSpaser() + "}");
DBG.Print("\n" + TabSpaser() + "else");
DBG.Print("\n" + TabSpaser() + "{");
DBG.ENTER("IR_V1.CMD_IF_END()");
DBG.Print("\n" + TabSpaser() + "}");
DBG.Print("\n" + TabSpaser());
public void CMD_SWITCH_START(string SwitchValue)
DBG.Print("\n\n" + TabSpaser() + "switch(" + SwitchValue + ")\n"+ TabSpaser() + "{");
public void SWITCH_CASE(string CaseValue)
DBG.Print("\n" + TabSpaser() + "case " + CaseValue + ":");
public void BREAK_IN_SWITCH()
DBG.Print("\n" + TabSpaser() + "break;");
public void SWITCH_DEFAULT()
DBG.Print("\n" + TabSpaser() + "default:");
DBG.Print("\n" + TabSpaser() + "}\n");
DBG.Print("\n\n" + TabSpaser() + "do\n" + TabSpaser() + "{");
public void DO_END(string Op1, string CmpSign, string Op2)
DBG.Print("\n" + TabSpaser() + "}while(" + Op1 + " " + CmpSign + " " + Op2 + ");");
public void WHILE_START(string Op1, string CmpSign, string Op2)
DBG.Print("\n\n" + TabSpaser() + "while(" + Op1 + " " + CmpSign + " " + Op2 + ")\n" + TabSpaser() + "{");
DBG.Print("\n" + TabSpaser() + "};");
public void FOR_START(string Op1, string CmpSign, string Op2)
██ ██ ██ ███████ ████ ██████ ███████ ██████ ███████ ██████ ███████ ██ ███████
████████████████████████████████████████████████████████████████████████████████████████████████████████████ */
class IR_V3_Generete_Destructured_DePL
public void Next_Sentence_in_global_scope()
DBG.ENTER("IR_V1.Next_Sentence_in_global_scope()");
public void Def_Variable(string Type, string Name)
DBG.ENTER("IR_V1.Def_Variable(T, N)");
DBG.Print("\n" + TabSpaser() + Name + " " + ConvertType(Type));
public void Def_Variable(string Type, string Name, string InitValue)
DBG.ENTER("IR_V1.Def_Variable(T, N, V)");
if(Type == "double" || Type == "float")
if(InitValue.Contains('.') == false)
InitValue = InitValue + ".0";
DBG.Print("\n" + TabSpaser() + Name + " = " + InitValue);
public void Define_Function_START(string FuncName, string RetutnType)
DBG.ENTER("IR_V1.Define_Function_START()");
DBG.Print(TabSpaser() + "ФУНКЦІЯ " + FuncName + "(");
public void Function_NextArg(string Param_Name, string Param_Type)
DBG.ENTER("IR_V1.Function_NextArg()");
DBG.Print(Param_Name + " " + ConvertType(Param_Type));
DBG.Print(", " + Param_Name + " " + ConvertType(Param_Type));
public void Function_ArgList_END()
DBG.ENTER("IR_V1.Function_ArgList_END()");
string Type_in_DePL = ConvertType(RT);
DBG.Print(") " + Type_in_DePL);
public void Def_Function_END()
DBG.ENTER("IR_V1.Def_Function_END()");
DBG.Print("\n" + TabSpaser() + "ФІНІШ");
public void RETURN_w_Value(string Value)
DBG.ENTER("IR_V1.RETURN_w_Value()");
DBG.Print("\n" + TabSpaser() + "ВЕРНУТИСЬ " + Value);
public void RETURN_VOID()
DBG.ENTER("IR_V1.RETURN_VOID()");
DBG.Print("\n" + TabSpaser() + "ВЕРНУТИСЬ");
public void GOTO(string Lb_Name)
DBG.ENTER("IR_V1.GOTO()");
DBG.Print("\n --------------------- PROBLEM!!! ---------------------------");
DBG.Print("\n -------------- DePL not supported \"goto\" -------------------");
string[] LB = new string[1000];
public void CMD_IF(string Op1, string CmpSign, string Op2)
DBG.ENTER("IR_V1.CMD_IF()");
LB[Curr_IF_Level] = Gen_Label_Name();
DBG.Print("\n" + TabSpaser() + "ЯКЩО " + Op1 + " " + Inverse_CMP(CmpSign) + " " + Op2 + " СТРИБНУТИ_НА " + LB[Curr_IF_Level]);
string Inverse_CMP(string CMP)
DBG.ENTER("IR_V1.CMD_ELSE()");
DBG.Print("\n" + TabSpaser() + "СТРИБНУТИ_НА " + LB[Curr_IF_Level-1] + "_2");
DBG.Print("\n" + TabSpaser() + LB[Curr_IF_Level-1] + ":");
LB[Curr_IF_Level-1] = LB[Curr_IF_Level-1] + "_";
DBG.ENTER("IR_V1.CMD_IF_END()");
string LB_Name = LB[Curr_IF_Level];
if(LB_Name[LB_Name.Length-1] == '_')
DBG.Print("\n" + TabSpaser() + LB_Name + ':');
string ConvertType(string type)
DBG.ENTER("IR_V1.ConvertType()");
case "void" : return "void";
case "int" : return "int";
case "float" : return "double";
case "double": return "double";
public void CMD_SWITCH_START(string SwitchValue)
LB[Curr_IF_Level] = Gen_Label_Name();
LB[Curr_IF_Level] = SwitchValue;
LB[Curr_IF_Level] = Gen_Label_Name();
DBG.Print("\n\nСТРИБНУТИ_НА " + LB[Curr_IF_Level-1]);
DBG.Print(" ----- switch START (see remark)");
public void SWITCH_CASE(string CaseValue)
string Case_Label = LB[Curr_IF_Level-1];
DBG.Print("\nСТРИБНУТИ_НА " + Case_Label + "_2");
DBG.Print(" ----- Realization Fall_Through");
DBG.Print("\n" + Case_Label + ":");
LB[Curr_IF_Level] = Gen_Label_Name();
DBG.Print("\nЯКЩО " + LB[Curr_IF_Level-2] + " ≠ " + CaseValue + " СТРИБНУТИ_НА " + LB[Curr_IF_Level-1]);
DBG.Print(" ----- case " + CaseValue + ":");
DBG.Print("\n" + Case_Label + "_2:");
public void BREAK_IN_SWITCH()
DBG.Print("\nСТРИБНУТИ_НА " + LB[Curr_IF_Level-3]);
DBG.Print(" ----- break; ");
public void SWITCH_DEFAULT()
string Case_Label = LB[Curr_IF_Level-1];
DBG.Print("\n" + Case_Label + ":");
DBG.Print(" ----- default:");
LB[Curr_IF_Level] = Gen_Label_Name();
string Label = LB[Curr_IF_Level-1];
DBG.Print("\n" + Label + ":");
string Label_ForAll_Breaks = LB[Curr_IF_Level-2];
DBG.Print("\n" + Label_ForAll_Breaks + ":");
DBG.Print(" ----- switch END");
LB[Curr_IF_Level] = Gen_Label_Name();
DBG.Print("\n\n" + LB[Curr_IF_Level-1] + ": ----- DO_START");
public void DO_END(string Op1, string CmpSign, string Op2)
DBG.Print("\nЯКЩО " + Op1 + " " + CmpSign + " " + Op2 + " " + "СТРИБНУТИ_НА " + LB[Curr_IF_Level-1] + " ----- DO_END");
public void WHILE_START(string Op1, string CmpSign, string Op2)
LB[Curr_IF_Level] = Gen_Label_Name();
DBG.Print("\n\n" + LB[Curr_IF_Level-1] + ": ----- WHILE_START");
DBG.Print("\nЯКЩО " + Op1 + " " + Inverse_CMP(CmpSign) + " " + Op2 + " " + "СТРИБНУТИ_НА " + LB[Curr_IF_Level-1] + "_2");
DBG.Print("\nСТРИБНУТИ_НА " + LB[Curr_IF_Level-1] + ": ----- WHILE_END");
DBG.Print("\n" + LB[Curr_IF_Level-1] + "_2:");
public void FOR_START(string Op1, string CmpSign, string Op2)
LB[Curr_IF_Level] = Gen_Label_Name();
DBG.Print(" ----- FOR_START");
DBG.Print("\n" + LB[Curr_IF_Level-1] + ":");
DBG.Print("\nЯКЩО " + Op1 + " " + Inverse_CMP(CmpSign) + " " + Op2 + " " + "СТРИБНУТИ_НА " + LB[Curr_IF_Level-1] + "_2");
DBG.Print("\nСТРИБНУТИ_НА " + LB[Curr_IF_Level-1] + ": ----- FOR_END");
DBG.Print("\n" + LB[Curr_IF_Level-1] + "_2:");
class IR_V4_Generete_Destructured_CPP
public void Next_Sentence_in_global_scope()
DBG.ENTER("IR_V4.Next_Sentence_in_global_scope()");
public void Def_Variable(string Type, string Name)
DBG.ENTER("IR_V4.Def_Variable(T, N)");
DBG.Print("\n" + TabSpaser() + Type + " " + Name + ";");
public void Def_Variable(string Type, string Name, string InitValue)
DBG.ENTER("IR_V4.Def_Variable(T, N, V)");
DBG.Print("\n" + TabSpaser() + Type + " " + Name + " = " + InitValue + ";");
public void Define_Function_START(string FuncName, string RetutnType)
DBG.ENTER("IR_V4.Define_Function_START()");
DBG.Print(TabSpaser() + RetutnType + " " + FuncName + "(");
public void Function_NextArg(string Param_Name, string Param_Type)
DBG.ENTER("IR_V4.Function_NextArg()");
DBG.Print(Param_Type + " " + Param_Name);
DBG.Print(", " + Param_Type + " " + Param_Name);
public void Function_ArgList_END()
DBG.ENTER("IR_V1.Function_ArgList_END()");
public void Def_Function_END()
DBG.ENTER("IR_V4.Def_Function_END()");
DBG.Print("\n" + TabSpaser() + "}");
public void RETURN_w_Value(string Value)
DBG.ENTER("IR_V4.RETURN_w_Value()");
DBG.Print("\n" + TabSpaser() + "return " + Value + ";");
public void RETURN_VOID()
DBG.ENTER("IR_V1.RETURN_VOID()");
DBG.Print("\n" + TabSpaser() + "return;");
public void GOTO(string Lb_Name)
DBG.ENTER("IR_V4.GOTO()");
DBG.Print("\n" + TabSpaser() + "goto " + Lb_Name + ";");
string[] LB = new string[1000];
public void CMD_IF(string Op1, string CmpSign, string Op2)
DBG.ENTER("IR_V4.CMD_IF()");
LB[Curr_IF_Level] = Gen_Label_Name();
DBG.Print("\n" + TabSpaser() + "if(" + Op1 + " " + Inverse_CMP(CmpSign) + " " + Op2 + ") goto " + LB[Curr_IF_Level] + ";");
DBG.Print(" // IF_START ");
string Inverse_CMP(string CMP)
DBG.ENTER("IR_V4.CMD_ELSE()");
DBG.Print("\n" + TabSpaser() + "goto " + LB[Curr_IF_Level-1] + "_2; // IF_ELSE");
DBG.Print("\n" + TabSpaser() + LB[Curr_IF_Level-1] + ":");
LB[Curr_IF_Level-1] = LB[Curr_IF_Level-1] + "_";
DBG.ENTER("IR_V4.CMD_IF_END()");
string LB_Name = LB[Curr_IF_Level];
if(LB_Name[LB_Name.Length-1] == '_')
DBG.Print("\n" + TabSpaser() + LB_Name + ": // IF_END");
public void CMD_SWITCH_START(string SwitchValue)
LB[Curr_IF_Level] = Gen_Label_Name();
LB[Curr_IF_Level] = SwitchValue;
LB[Curr_IF_Level] = Gen_Label_Name();
DBG.Print("\n\ngoto " + LB[Curr_IF_Level-1] + ";");
DBG.Print(" // switch START (see remark)");
public void SWITCH_CASE(string CaseValue)
string Case_Label = LB[Curr_IF_Level-1];
DBG.Print("\ngoto " + Case_Label + "_2;");
DBG.Print(" // Realization Fall_Through");
DBG.Print("\n" + Case_Label + ":");
LB[Curr_IF_Level] = Gen_Label_Name();
DBG.Print("\nif(" + LB[Curr_IF_Level-2] + " != " + CaseValue + ") goto " + LB[Curr_IF_Level-1] + ";");
DBG.Print(" // case " + CaseValue + ":");
DBG.Print("\n" + Case_Label + "_2:");
public void BREAK_IN_SWITCH()
DBG.Print("\ngoto " + LB[Curr_IF_Level-3] + ";");
DBG.Print(" // break; ");
public void SWITCH_DEFAULT()
string Case_Label = LB[Curr_IF_Level-1];
DBG.Print("\n" + Case_Label + ":");
DBG.Print(" // default:");
LB[Curr_IF_Level] = Gen_Label_Name();
string Label = LB[Curr_IF_Level-1];
DBG.Print("\n" + Label + ":");
string Label_ForAll_Breaks = LB[Curr_IF_Level-2];
DBG.Print("\n" + Label_ForAll_Breaks + ":");
DBG.Print(" // switch END");
LB[Curr_IF_Level] = Gen_Label_Name();
DBG.Print("\n\n" + LB[Curr_IF_Level-1] + ": // DO_START");
public void DO_END(string Op1, string CmpSign, string Op2)
DBG.Print("\nif( " + Op1 + " " + CmpSign + " " + Op2 + ") goto " + LB[Curr_IF_Level-1] + "; // DO_END");
public void WHILE_START(string Op1, string CmpSign, string Op2)
LB[Curr_IF_Level] = Gen_Label_Name();
DBG.Print("\n\n" + LB[Curr_IF_Level-1] + ": // WHILE_START");
DBG.Print("\nif(" + Op1 + " " + Inverse_CMP(CmpSign) + " " + Op2 + ") goto " + LB[Curr_IF_Level-1] + "_2;");
DBG.Print("\ngoto " + LB[Curr_IF_Level-1] + "; // WHILE_END");
DBG.Print("\n" + LB[Curr_IF_Level-1] + "_2:");
public void FOR_START(string Op1, string CmpSign, string Op2)
LB[Curr_IF_Level] = Gen_Label_Name();
DBG.Print(" // FOR_START");
DBG.Print("\n" + LB[Curr_IF_Level-1] + ":");
DBG.Print("\nif(" + Op1 + " " + Inverse_CMP(CmpSign) + " " + Op2 + ") goto " + LB[Curr_IF_Level-1] + "_2;");
DBG.Print("\ngoto " + LB[Curr_IF_Level-1] + ": // FOR_END");
DBG.Print("\n" + LB[Curr_IF_Level-1] + "_2:");
public Stack_int(int Stack_Size)
StackArray = new int[Stack_Size];
public void PUSH(int Value)
StackArray[TopPos] = Value;
int TMP = StackArray[TopPos];
return StackArray[TopPos];
Stack_int All_ParentNodes = new Stack_int(1000);
int Create_Node(string label)
DBG.Print("\n" + TabSpaser() + "n" + LastAddedNode_Number + "[label=\"" + label + "\", xlabel=\"n" + LastAddedNode_Number + "\"];");
return LastAddedNode_Number;
int Create_Node(string label, string color)
DBG.Print("\n" + TabSpaser() + "n" + LastAddedNode_Number + "[label=\"" + label + "\", xlabel=\"n" + LastAddedNode_Number + "\", fillcolor = \"" + color + "\", color = \"" + "black" + "\"];");
return LastAddedNode_Number;
void Create_Link(int Src, int Dest)
DBG.Print("\n" + TabSpaser() + "n" + Src + " -> n" + Dest);
void Create_Link(int Src, int Dest, string color)
DBG.Print("\n" + TabSpaser() + "n" + Src + " -> n" + Dest + " [color = \"" + color + "\"]");
Create_Node("GLOBAL", "green");
All_ParentNodes.PUSH(LastAddedNode_Number);
public void Next_Sentence_in_global_scope()
DBG.ENTER("IR_V5.Next_Sentence_in_global_scope()");
for(int i = 0; i < TabLevel; i++)
int LastAddedNode_Number = 0;
public void Def_Variable(string Type, string Name)
DBG.ENTER("IR_V2.Def_Variable(T, N)");
DBG.Print("\n\n"+ TabSpaser() + "// " + Type + " " + Name + ";");
Create_Node("Define\\nVariable", "aquamarine2");
Create_Node("Var\\nName", "aquamarine2");
Create_Node("Var\\nType", "aquamarine2");
Create_Link(All_ParentNodes.SEE_TOP(), LastAddedNode_Number-2, "aquamarine2");
Create_Link(LastAddedNode_Number-2, LastAddedNode_Number-1, "aquamarine2");
Create_Link(LastAddedNode_Number-2, LastAddedNode_Number, "aquamarine2");
public void Def_Variable(string Type, string Name, string InitValue)
DBG.ENTER("IR_V2.Def_Variable(T, N, V)");
DBG.Print("\n\n"+ TabSpaser() + "// " + Type + " " + Name + " = " + InitValue + ";");
Create_Node("Define\\nVariable", "aquamarine2");
Create_Node("Var\\nName", "aquamarine2");
Create_Node("Var\\nType", "aquamarine2");
Create_Node("Init\\nValue", "aquamarine2");
Create_Link(All_ParentNodes.SEE_TOP(), LastAddedNode_Number-3, "aquamarine2");
Create_Link(LastAddedNode_Number-3, LastAddedNode_Number-2, "aquamarine2");
Create_Link(LastAddedNode_Number-3, LastAddedNode_Number-1, "aquamarine2");
Create_Link(LastAddedNode_Number-3, LastAddedNode_Number, "aquamarine2");
public void Define_Function_START(string FuncName, string RetutnType)
DBG.ENTER("IR_V1.Define_Function_START()");
DBG.Print("\n\n// " + RetutnType + " " + FuncName + "(");
Create_Node("Define\\nFunction", "gold");
Create_Link(All_ParentNodes.SEE_TOP(), LastAddedNode_Number, "gold");
Create_Node("FuncName", "gold");
Create_Node("RetType", "gold");
Create_Node("ArgList", "gold");
Create_Link(LastAddedNode_Number-3, LastAddedNode_Number-2, "gold");
Create_Link(LastAddedNode_Number-3, LastAddedNode_Number-1, "gold");
Create_Link(LastAddedNode_Number-3, LastAddedNode_Number, "gold");
All_ParentNodes.PUSH(LastAddedNode_Number-3);
All_ParentNodes.PUSH(LastAddedNode_Number);
public void Function_NextArg(string Param_Name, string Param_Type)
DBG.ENTER("IR_V1.Function_NextArg()");
DBG.Print("\n\n" + TabSpaser() + "// Arg #" + Arg_Cnt + " " + Param_Type + " " + Param_Name);
Create_Node("Arg #" + Arg_Cnt, "aquamarine2");
Create_Node("Name", "aquamarine2");
Create_Node("Type", "aquamarine2");
Create_Link(All_ParentNodes.SEE_TOP(), LastAddedNode_Number-2, "aquamarine2");
Create_Link(LastAddedNode_Number-2, LastAddedNode_Number-1, "aquamarine2");
Create_Link(LastAddedNode_Number-2, LastAddedNode_Number, "aquamarine2");
public void Function_ArgList_END()
DBG.ENTER("IR_V1.Function_ArgList_END()");
DBG.Print("\n\n" + TabSpaser() + "// ArgList END");
Create_Node("Body", "gold");
Create_Link(All_ParentNodes.SEE_TOP(), LastAddedNode_Number, "gold");
All_ParentNodes.PUSH(LastAddedNode_Number);
public void Def_Function_END()
DBG.ENTER("IR_V1.Def_Function_END()");
DBG.Print("\n" + TabSpaser() + "}");
public void RETURN_w_Value(string Value)
DBG.ENTER("IR_V1.RETURN_w_Value()");
DBG.Print("\n" + TabSpaser() + "return " + Value + ";");
public void RETURN_VOID()
DBG.ENTER("IR_V1.RETURN_VOID()");
DBG.Print("\n" + TabSpaser() + "return;");
public void GOTO(string Lb_Name)
DBG.ENTER("IR_V1.GOTO()");
DBG.Print("\n" + TabSpaser() + "goto " + Lb_Name + ";");
public void CMD_IF(string Op1, string CmpSign, string Op2)
DBG.ENTER("IR_V1.CMD_IF()");
DBG.Print("\n" + TabSpaser());
DBG.Print("\n" + TabSpaser() + "if(" + Op1 + " " + CmpSign + " " + Op2 + ")");
DBG.Print("\n" + TabSpaser() + "{");
DBG.ENTER("IR_V1.CMD_ELSE()");
DBG.Print("\n" + TabSpaser() + "}");
DBG.Print("\n" + TabSpaser() + "else");
DBG.Print("\n" + TabSpaser() + "{");
DBG.ENTER("IR_V1.CMD_IF_END()");
DBG.Print("\n" + TabSpaser() + "}");
DBG.Print("\n" + TabSpaser());
public void CMD_SWITCH_START(string SwitchValue)
DBG.Print("\n\n" + TabSpaser() + "switch(" + SwitchValue + ")\n"+ TabSpaser() + "{");
public void SWITCH_CASE(string CaseValue)
DBG.Print("\n" + TabSpaser() + "case " + CaseValue + ":");
public void BREAK_IN_SWITCH()
DBG.Print("\n" + TabSpaser() + "break;");
public void SWITCH_DEFAULT()
DBG.Print("\n" + TabSpaser() + "default:");
DBG.Print("\n" + TabSpaser() + "}\n");
DBG.Print("\n\n" + TabSpaser() + "// do{");
Create_Node("DO-WHILE", "coral3");
Create_Node("Body", "coral3");
int TMP = LastAddedNode_Number;
Create_Link(All_ParentNodes.SEE_TOP(), LastAddedNode_Number-1, "coral3");
Create_Link(LastAddedNode_Number-1, LastAddedNode_Number, "coral3");
All_ParentNodes.PUSH(TMP-1);
All_ParentNodes.PUSH(TMP);
public void DO_END(string Op1, string CmpSign, string Op2)
DBG.Print("\n\n" + TabSpaser() + "// } while(" + Op1 + " " + CmpSign + " " + Op2 + ");");
Create_Node("Cond", "coral3");
Create_Link(All_ParentNodes.SEE_TOP(), LastAddedNode_Number, "coral3");
Create_Node(CmpSign, "deeppink2");
Create_Node(Op1, "deeppink2");
Create_Node(Op2, "deeppink2");
Create_Link(LastAddedNode_Number-3, LastAddedNode_Number-2, "deeppink2");
Create_Link(LastAddedNode_Number-2, LastAddedNode_Number-1, "deeppink2");
Create_Link(LastAddedNode_Number-2, LastAddedNode_Number, "deeppink2");
public void WHILE_START(string Op1, string CmpSign, string Op2)
DBG.Print("\n\n" + TabSpaser() + "// while(" + Op1 + " " + CmpSign + " " + Op2 + ")");
Create_Node("WHILE", "coral3");
Create_Node("Cond", "coral3");
Create_Node("Body", "coral3");
int TMP = LastAddedNode_Number;
Create_Link(All_ParentNodes.SEE_TOP(), LastAddedNode_Number-2, "coral3");
Create_Link(LastAddedNode_Number-2, LastAddedNode_Number-1, "coral3");
Create_Link(LastAddedNode_Number-2, LastAddedNode_Number, "coral3");
Create_Node(CmpSign, "deeppink2");
Create_Node(Op1, "deeppink2");
Create_Node(Op2, "deeppink2");
Create_Link(LastAddedNode_Number-4, LastAddedNode_Number-2, "deeppink2");
Create_Link(LastAddedNode_Number-2, LastAddedNode_Number-1, "deeppink2");
Create_Link(LastAddedNode_Number-2, LastAddedNode_Number, "deeppink2");
All_ParentNodes.PUSH(TMP);
public void FOR_START(string Op1, string CmpSign, string Op2)
static int Enter_Cnt = 0;
static bool View_Call_Tree = false;
static bool Visibled = false;
static bool Colored_Console = false;
static public void Colored_Console_ON()
static public void View_Call_Tree_ON()
Console.Write("\n ---------- SHOW CALL TREE --------------------------");
static public void View_Call_Tree_OFF()
Console.Write("\n ---------- HIDE CALL TREE --------------------------");
public static void ENTER(string Msg)
if(View_Call_Tree == false)
for(int i=0; i<Level; i++)
for(int i=0; i<Level; i++)
Console.Write("· " + Msg + " " + Enter_Cnt);
public static void RETURN()
public static void RETURN(string Msg)
if(View_Call_Tree == false)
for(int i=0; i<Level; i++)
ConsoleColor TMP = Console.ForegroundColor;
if(Colored_Console == true)
Console.ForegroundColor = ConsoleColor.Blue;
if(Colored_Console == true)
Console.ForegroundColor = TMP;
public static void Print_ON()
public static void Print_OFF()
public static void Print(string Str, ConsoleColor Clr)
ConsoleColor TMP = Console.ForegroundColor;
if(Colored_Console == true)
Console.ForegroundColor = Clr;
if(Colored_Console == true)
Console.ForegroundColor = TMP;
public static void Print(string Str)
public static void Print(string[] Str)
DBG.Print("[\"" + s + "\"]\n");
public static void Print(Token[] TknList)
DBG.Print(" TOKEN LIST:\n\n");
DBG.Print(" TYPE VALUE\n\n");
for(int i = 0; i < TknList.Length-1; i++)
Token Current_Token = TknList[i];
int TypeStr_Lenght = Current_Token.Type.ToString().Length;
int Spacer_Len = 16 - TypeStr_Lenght;
for(int j = 0; j < Spacer_Len; j++)
DBG.Print( Current_Token.Type + Spacer + "\"" + Current_Token.Value + "\"\n");
DBG.ENTER("ERROR_TRAP()");
System.Environment.Exit(10);
public static void Src_ERROR_TRAP(string Msg)
DBG.ENTER("Src_ERROR_TRAP()");
Console.Write(" ----> Src_ERROR_TRAP(\"" + Msg + "\");\n\n\n");
System.Environment.Exit(10);
public string[] Split_to_Lexems(string Src)
DBG.ENTER("Split_to_Lexems()");
for(int i = 0; i < Src.Length; i++)
case ' ' : Lexems_List += "\n"; break;
case '\t': Lexems_List += '\n'; break;
case '\n': Lexems_List += '\n'; break;
case '\r': Lexems_List += '\n'; break;
case '(' : Lexems_List += "\n(\n"; break;
case ')' : Lexems_List += "\n)\n"; break;
case '{' : Lexems_List += "\n{\n"; break;
case '}' : Lexems_List += "\n}\n"; break;
case ';' : Lexems_List += "\n;\n"; break;
case '+' : Lexems_List += "\n+\n"; break;
case '-' : Lexems_List += "\n-\n"; break;
case '*' : Lexems_List += "\n*\n"; break;
case '/' : Lexems_List += "\n/\n"; break;
case ',' : Lexems_List += "\n,\n"; break;
case ':' : Lexems_List += "\n:\n"; break;
if(Char.IsDigit(Next_c) == false)
default: Lexems_List += c; break;
Lexems_List = Clear_NewLine_Pack(Lexems_List);
char[] Spacer = new char[]{'\n'};
string[] Lexems = Lexems_List.Split(Spacer, StringSplitOptions.RemoveEmptyEntries);
string Clear_NewLine_Pack(string Str)
DBG.ENTER("Clear_NewLine_Pack()");
int Str_Len = Str.Length;
char Prev_Symbol = (char)0;
for(int i = 0; i < Str_Len; i++)
public Token[] Create_Token_List(string Src)
DBG.ENTER("Create_Token_List()");
string[] Lexems = Lex.Split_to_Lexems(Src);
Token [] Token_Array_Sructs = Create_Token_Array (Lexems);
return Token_Array_Sructs;
Token[] Create_Token_Array(string[] Lexems)
DBG.ENTER("Create_Token_Array()");
Token[] Token_Array_Sructs = new Token[Lexems.Length + 2];
for(int i = 0; i < Lexems.Length; i++)
string Lexem = Lexems[i];
if (Is_Punctuator (Lexem) == true) { T.Type = T_Type.Punctuator; T.Value = Lexem; }
else if(Is_BuildInType (Lexem) == true) { T.Type = T_Type.BuildInType; T.Value = Lexem; }
else if(Is_Number (Lexem) == true) { T.Type = T_Type.Number; T.Value = Lexem; }
else if(Is_ControlKeyWord(Lexem) == true) { T.Type = T_Type.ControlKeyWord; T.Value = Lexem; }
else if(Is_Operation (Lexem) == true) { T.Type = T_Type.Operation; T.Value = Lexem; }
else if(Is_Identifier (Lexem) == true) { T.Type = T_Type.Identifier; T.Value = Lexem; }
else if(Is_String (Lexem) == true)
Lexem = Lexem.Remove(0, 1);
Lexem = Lexem.Remove(Lexem.Length-1);
T.Type = T_Type.Literal_String;
DBG.Src_ERROR_TRAP("Undef lexem type - " + Lexem);
Token_Array_Sructs[i] = T;
Token T_EOF = new Token();
Token_Array_Sructs[Lexems.Length] = T_EOF;
DBG.Print("\n\n------------------\n\n\n");
DBG.Print(Token_Array_Sructs);
return Token_Array_Sructs;
bool Is_Punctuator(string Str)
DBG.ENTER("Is_Punctuator()");
static bool Is_BuildInType(string Str)
DBG.ENTER("Is_BuildInType()");
if(Str == "int") { DBG.RETURN(); return true; }
if(Str == "float") { DBG.RETURN(); return true; }
if(Str == "double") { DBG.RETURN(); return true; }
if(Str == "char") { DBG.RETURN(); return true; }
if(Str == "void") { DBG.RETURN(); return true; }
bool Is_ControlKeyWord(string Str)
DBG.ENTER("Is_ControlKeyWord()");
if(Str == "if") return true;
if(Str == "else") return true;
if(Str == "while") return true;
if(Str == "for") return true;
if(Str == "do") return true;
if(Str == "goto") return true;
if(Str == "return") return true;
if(Str == "switch") return true;
if(Str == "case") return true;
if(Str == "default") return true;
bool Is_Operation(string Str)
DBG.ENTER("Is_Operation()");
if(Str == "+") return true;
if(Str == "-") return true;
if(Str == "*") return true;
if(Str == "/") return true;
if(Str == "=") return true;
if(Str == "==") return true;
if(Str == "!=") return true;
if(Str == ">" ) return true;
if(Str == "<" ) return true;
if(Str == ">=") return true;
if(Str == "<=") return true;
bool Is_Identifier(string Str)
DBG.ENTER("Is_Identifier()");
int Str_Len = Str.Length;
for(int i = 0; i < Str_Len; i++)
if(c != '_' && Char.IsLetter(c) == false && Char.IsDigit(c) == false)
bool Is_Number(string Str)
DBG.ENTER("Is_Number()");
bool Is_String(string Str)
DBG.ENTER("Is_String()");