سورس پارسر ساده کامپایلر زبان C
در این بخش سورس پارسر ساده کامپایلر زبان C را برای شما آماده کرده ایم که با استفاده از نرم افزار DevC++ با زبان برنامه نویسی C نوشته شده است. در ادامه می توانید توضیحات، تصاویر و همچنین فیلمی از نحوه اجرا شدن پروژه را مشاهده کنید.
توضیحات پروژه
کامپایلر نرم افزار یا مجموعه ای نرم افزارها است که کدهای نوشته شده به زبان برنامه نویسی سطح بالا (زبان مبدأ) را به یک زبان سطح پایین تر مانند زبان اسمبلی یا کد ماشین تبدیل می کند.
در این پروژه جالب بعد از اجرا شدن برنامه محتوای فایل input.txt که حاوی کدهای ساده نوشته شده به زبان C است، خوانده می شود و سپس توسط برنامه بخش های مختلف آن تجزیه شده و خطاها و ایرادات موجود در کد داخل فایل output.txt ذخیره می شود. این پروژه فقط بخش تجزیه بعضی از دستورات را انجام میدهد و خروجی exe به شما نخواهد داد.
شما با مشاهده سورس کد این پروژه می توانید نحوه کار با فایل ها، آرایه های چند بعدی، ساختارها و غیره را یاد گرفته و مهارت برنامه نویسی خودتان را ارتقا دهید.
قسمت های از سورس کد
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | #include <stdio.h> #include <stdio.h> #include <string.h> #include <ctype.h> //===================================== #define colverify 0 #define colerror 1 #define colid 2 #define COLCOUNT 3 #define COL_START 3 #define MAX_ROW 50 #define MAX_COL 50 #define fileinput "input.txt" #define fileoutput "output.txt" #define StatementVar 'v' #define StatementIf 'e' #define StatementFor 'f' #define StatementWhile 'w' #define StatementEntesab '=' //===================================== typedef enum {sym_ident,sym_plus,sym_mines,sym_multi,sym_div,sym_grad,sym_les,sym_entesab ,sym_comment, sym_begin, sym_semicolon,sym_parantez, sym_end,sym_for, sym_if, sym_while, sym_comma,sym_var,sym_notfound} Symbol; typedef enum {error_lenvar,error_alphavar,error_notfound,error_nosimicalon,error_varrepeated ,error_unknow,error_noparantez,error_exp,error_noblock} ErrorList ; int CountLine = -1; //===================================== void empty_array_var(); void get_source_code(); void empty_array_code(); void print_array_code(); void add_var(char id); void get_var(int n); void get_if(int n); void get_for(int n); void get_while(int n); void verify_code(); int search_char(char ch,int start,int end); void save_source_code(); void get_id_symbol(); char tolowerchar(char ch); void copy_row_toarraytemp(int row); void copy_arraytemp_torow(int row); int search_var(int *n); int search_if(int *n); int search_for(int *n); int search_while(int *n); int search_entesab(int *n); int repeated_var(char ch); int verify_exp(int start,int end); int check_operator(char ch); int isnum(char ch); int verify_block(int start,int end,int *found1,int *found2); //==================================== char array_code[MAX_ROW][MAX_COL]; char array_var[MAX_ROW]; char array_row[MAX_ROW]; Symbol sym; char str_var[4] = {'v','a','r',' '}; char str_if[3] = {'i','f','('}; char str_for[4] = {'f','o','r','('}; char str_while[6] = {'w','h','i','l','e','('}; char str_entesab[1] = {'='}; int main() { empty_array_code(); empty_array_var(); get_source_code(); verify_code(); save_source_code(); printf("Create OutPut File."); getch(); return 0; } //==================================== void empty_array_var() { int i; for(i=0;i<MAX_ROW;i++) array_var[i]=' '; } //================================== void get_source_code() { FILE *fp1; char ch; int i,j,count; fp1=fopen(fileinput,"r"); if (fp1==NULL) { printf("\n Error In Open File..."); getch(); exit(1); } ch = getc(fp1); i=0; j=COL_START; while (ch != EOF ) { array_code[i][j] = tolowerchar(ch); ch = getc(fp1); j++; if(ch == '\n') { // ch = getc(fp1); ch = getc(fp1); j=COL_START; i++; CountLine++; } } fclose(fp1); } //====================================== void save_source_code() { int i=0,j=COL_START; FILE *f; f = fopen(fileoutput,"w"); for(i=0;i<=CountLine+1;i++) { while(array_code[i][j] != '0') { fputc(array_code[i][j],f); j++; } if(array_code[i][colverify] == '0') { if(array_code[i][colerror] == (char) error_noparantez) fprintf(f,"%s -->[%s]"," ==> Error Line!","Error Parantez"); else if(array_code[i][colerror] == (char) error_noblock) fprintf(f,"%s -->[%s]"," ==> Error Line!","Error block"); else if(array_code[i][colerror] == (char) error_exp) fprintf(f,"%s -->[%s]"," ==> Error Line!","Error Ebarat"); else if(array_code[i][colerror] == (char) error_unknow) fprintf(f,"%s -->[%s]"," ==> Error Line!","Error nashenakhte"); else if(array_code[i][colerror] == (char) error_varrepeated) fprintf(f,"%s -->[%s]"," ==> Error Line!","Error Tekrare Var"); else if(array_code[i][colerror] == (char) error_lenvar) fprintf(f,"%s -->[%s]"," ==> Error Line!","Error Len Var"); else if(array_code[i][colerror] == (char) error_alphavar) fprintf(f,"%s -->[%s]"," ==> Error Line!","Error Var No Alpha"); else if(array_code[i][colerror] == (char) error_nosimicalon) fprintf(f,"%s -->[%s]"," ==> Error Line!","Error simicalon Not Found"); } else fprintf(f,"%s"," ==> No Error"); fputc('\r',f); fputc('\n',f); j=COL_START; } fclose(f); } //================================== void add_var(char id) { int i; for(i=0;i<MAX_ROW;i++) if(array_var[i]==' ') { array_var[i] = id; return; } } |
هیچ نظری ثبت نشده است