Parser Parser_Obj = new Parser();
Parser_Obj.Parse("Example.cpp");
Console.Write("\n OS\n\n\n");
IR_V1_Generete_DEPL IR = new IR_V1_Generete_DEPL();
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();
DBG.Src_ERROR_TRAP("Undef type of Sentence - Token.Type = " + T.Type + "; Token.Value =" + T.Value);
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;
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_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");
████████████████████████████████████████████████████████████████████████████████████████████████████████████ */
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()");
char 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\" -------------------");
public void CMD_IF(string Op1, string CmpSign, string Op2)
DBG.ENTER("IR_V1.CMD_IF()");
DBG.Print("\n" + TabSpaser() + "ЯКЩО " + Op1 + " " + CmpSign + " " + Op2);
DBG.ENTER("IR_V1.CMD_ELSE()");
DBG.Print("\n" + TabSpaser() + "ІНАКШЕ");
DBG.ENTER("IR_V1.CMD_IF_END()");
DBG.Print("\n" + TabSpaser() + "КІНЕЦЬ");
char ConvertType(string type)
DBG.ENTER("IR_V1.ConvertType()");
case "void" : return 'v';
case "float" : return 'f';
case "double": return 'd';
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;
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;
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()");