Parser Parser_Obj = new Parser();
Parser_Obj.Parse("Example.cpp");
Console.Write("\n OS\n\n\n");
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 a;\n" +
string Src = "int a;\n" +
string Src = "int a;\n" +
DBG.ENTER("Parse_Glb_Scope()");
DBG.Print("\n\nNext sentence\n");
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.Value == "class") Parse_Sentence_Class();
else if(T.Value == "struct") Parse_Sentence_Struct();
DBG.ENTER("ERROR_TRAP()");
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;
default: ERROR_TRAP(); break;
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();
DBG.Print("\n\nParse_Var() ==> Var_Type = " + Var_Type.Value + "; Var_Name = " + Var_Name.Value + "\n");
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();
DBG.Print("\n\nParse_Var_w_Init() ==> Var_Type = " + Var_Type.Value + "; Var_Name = " + Var_Name.Value + "; Var_Init_Value = " + Var_Init_Value.Value + "\n");
void Parse_Definite_Function()
DBG.ENTER("Parse_Definite_Function()");
Token Ret_Type = Get_Next_Token();
Token Func_Name = Get_Next_Token();
DBG.Print("\n\nParse_Definite_Function() ==> Ret_Type = " + Ret_Type.Value + "; Func_Name = " + Func_Name.Value + "\n");
DBG.ENTER("Parse_Arg_List()");
DBG.Print("\n\nParse_Arg_List() ==> Arg_List is empty\n");
void Parse_Function_Body()
DBG.ENTER("Parse_Function_Body()");
DBG.Print("\n\nParse_Arg_List() ==> body is empty\n");
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)
public static void Print(string[] Str)
DBG.Print("[\"" + s + "\"]\n");
public static void Print(Token[] TknList)
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");
public static void Src_ERROR_TRAP(string Msg)
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;
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;
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()");