Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %{
- #include <stdio.h>
- #include <string.h>
- void yyerror(char*);
- int yylex();
- int p;
- int C[64][64];
- int S[64];
- int T[64];
- char info[64][16];
- %}
- %union{
- int id;
- char nm[16];
- }
- %token<nm> SYM
- %token<nm> NUM
- %token INT
- %token MAIN
- %token FOR
- %token OUTPUT
- %token INPUT
- %token LP RP
- %token LB RB
- %token LSB RSB
- %token CO
- %token ADD LE SUB ASS
- %token SEMI
- %type<id> stmt_list
- %type<id> stmt
- %type<id> ass
- %type<id> term
- %type<id> lval
- %type<id> pred
- %type<id> decl
- %type<id> expr
- %%
- program:
- program MAIN LP RP LB stmt_list RB
- {int i,t;
- printf("\tsection .bss\n");
- for(i=0;i<S[$6];++i){
- t=C[$6][i];
- if(T[t]==0) printf("%s\tresw\t2\n",info[t]);
- else if(T[t]==1) printf("%s\tresw\t2*%s\n",info[t],info[C[t][0]]);
- }
- printf("\tsection .text\n\tglobal main\nmain:\n");
- printf("\tpush ebp\n\tmov ebp, esp\n");
- }
- |
- ;
- stmt_list:
- stmt_list stmt SEMI
- {$$=$1;
- C[$$][S[$$]++]=$2;
- }
- | {$$=p++;}
- ;
- stmt:
- ass
- {$$=$1;}
- |decl
- {$$=$1;}
- |FOR LP ass SEMI pred SEMI ass RP stmt {}
- |INPUT LP term RP {}
- |OUTPUT LP term RP {}
- ;
- pred:
- SYM LE SYM {}
- ;
- decl:
- INT SYM
- {$$=p++;
- memset(info[$$],0,sizeof(info[$$]));
- memcpy(info[$$],$2,strlen($2));
- T[$$]=0;
- }
- |INT SYM LSB NUM RSB
- {int t;
- $$=p++;
- memset(info[$$],0,sizeof(info[$$]));
- memcpy(info[$$],$2,strlen($2));
- t=C[$$][0]=p++;S[$$]=1;
- T[$$]=1;
- memset(info[t],0,sizeof(info[t]));
- memcpy(info[t],$4,strlen($4));
- }
- ;
- ass:
- lval ASS expr
- {$$=p++;
- T[$$]=2;
- S[$$]=2;
- C[$$][0]=$1;C[$$][1]=$3;
- }
- ;
- expr:
- term {$$=$1;T[$$]=3;}
- |expr ADD term
- {$$=$1;T[$$]=3;
- }
- |expr SUB term
- {$$=$1;T[$$]=3;
- }
- ;
- term:
- NUM
- {$$=p++;
- memset(info[$$],0,sizeof(info[$$]));
- memcpy(info[$$],$1,strlen($1));
- }
- |lval
- {$$=$1;
- }
- ;
- lval:
- SYM
- {$$=p++;
- memset(info[$$],0,sizeof(info[$$]));
- memcpy(info[$$],$1,strlen($1));
- }
- |SYM LSB expr RSB
- {$$=p++;
- memset(info[$$],0,sizeof(info[$$]));
- memcpy(info[$$],$1,strlen($1));
- }
- ;
- %%
- void yyerror(char* s){
- fprintf(stderr,"%s\n",s);
- }
- int main(){
- //header
- printf("\
- extern scanf\n\
- extern printf\n\
- \
- section .data\n\
- ifmt db \"%%d\",0\n\
- ofmt db \"%%d\",10,0\n");
- p=0;
- memset(S,0,sizeof(S));
- yyparse();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement