rendered paste body%{
#include <stdio.h>
//int sym[26];
extern yylval;
extern FILE *yyin, *yyout;
//int yylex(void);
void yyerror(char *);
extern int lino;
%}
%token NUMBER FLOATNUM ID STR LOGOP
%token INT CHAR SHORT LONG FLOAT UNSIGNED DOUBLE UNSIGNED VOID
%token DELIM COMMA COLON EQUAL OPAR CPAR OBRACK CBRACK
%token EQL GT LT GTE LTE AND OR NOT
%token FOR WHILE DO IF SWITCH CASE ELSE
%token ADD SUB MUL DIV
%%
program:
dec_statements functions { printf("Success: \n");}
;
dec_statements:
dec_statements dec_statement
|
;
dec_statement:
INT iid_list DELIM
|SHORT INT iid_list DELIM
|CHAR iid_list DELIM
|SHORT INT iid_list DELIM
|FLOAT iid_list DELIM
|UNSIGNED INT iid_list DELIM
|LONG DOUBLE iid_list DELIM
|DOUBLE iid_list DELIM
;
iid_list:
iid_list COMMA iid_list2
|iid_list2
;
iid_list2:
ID
|ID EQUAL NUMBER
|ID EQUAL FLOAT
;
functions:
functions function
|function
;
function:
type ID OPAR param CPAR block
;
type:
INT
|CHAR
|SHORT INT
|FLOAT
|LONG
|DOUBLE
|UNSIGNED INT
|UNSIGNED LONG
|LONG DOUBLE
|UNSIGNED CHAR
|VOID
;
param:
param COMMA type ID
|type ID
|
;
block:
OBRACK statements CBRACK
;
statements:
statements statement
|
;
statement:
dec_statement
|assign_statement
|functioncall
|condition_statement
|loop_statement
|DELIM
;
assign_statement:
ID EQUAL expr
|ID ADD EQUAL expr
|ID SUB EQUAL expr
|ID MUL EQUAL expr
|ID DIV EQUAL expr
;
expr:
para
| expr ADD expr
| expr SUB expr
| expr MUL expr
| expr DIV expr
| OPAR expr CPAR
;
para:
ID
|num_type
num_type:
NUMBER
|FLOATNUM
;
functioncall:
ID OPAR func_par_list CPAR DELIM
;
func_par_list:
func_par_list COMMA para
|para
|
;
condition_statement:
if_con
|switch_con
;
if_con:
IF OPAR condition CPAR st_block
|IF OPAR condition CPAR st_block ELSE st_block
;
condition:
condition AND condition
|condition OR condition
|NOT condition
|para LT para
|para GT para
|para LTE para
|para GTE para
|para EQL para
|OPAR condition CPAR
;
st_block:
OBRACK statements CBRACK
|statement
;
switch_con:
SWITCH OPAR ID CPAR case_block
;
case_block:
case_block CASE para COLON statements
|
;
loop_statement:
for_loop
|while_loop
|do_loop
;
for_loop:
FOR OPAR dec_statement condition statement CPAR st_block
;
while_loop:
WHILE OPAR condition CPAR st_block
;
do_loop:
DO st_block WHILE OPAR condition CPAR DELIM
;
%%
void yyerror(char *s)
{
int i;
fprintf(stderr,"%s \t %d \n",s,lino);
/* while( (c = fgetc(yyin)) != ';')
{
printf("%c\n",c);
scanf("%c",&c);
lseek(yyin,-3,SEEK_CUR);
}
fputs("*",yyin);
while( fgetc(yyin) == ';' );
fputs("",yyin); */
while((i=yylex())!=DELIM)
{
if(i==0)
exit(0);
}
// lseek(yyin,0,SEEK_SET);
yyparse();
return;
}
int main(void)
{
yyin = fopen("inp.txt","rw");
yyout = fopen("op.txt","w");
yyparse();
return 0;
}
%{
#include <stdio.h>
//int sym[26];
extern yylval;
extern FILE *yyin, *yyout;
//int yylex(void);
void yyerror(char *);
extern int lino;
%}
%token NUMBER FLOATNUM ID STR LOGOP
%token INT CHAR SHORT LONG FLOAT UNSIGNED DOUBLE UNSIGNED VOID
%token DELIM COMMA COLON EQUAL OPAR CPAR OBRACK CBRACK
%token EQL GT LT GTE LTE AND OR NOT
%token FOR WHILE DO IF SWITCH CASE ELSE
%token ADD SUB MUL DIV
%%
program:
dec_statements functions { printf("Success: \n");}
;
dec_statements:
dec_statements dec_statement
|
;
dec_statement:
INT iid_list DELIM
|SHORT INT iid_list DELIM
|CHAR iid_list DELIM
|SHORT INT iid_list DELIM
|FLOAT iid_list DELIM
|UNSIGNED INT iid_list DELIM
|LONG DOUBLE iid_list DELIM
|DOUBLE iid_list DELIM
;
iid_list:
iid_list COMMA iid_list2
|iid_list2
;
iid_list2:
ID
|ID EQUAL NUMBER
|ID EQUAL FLOAT
;
functions:
functions function
|function
;
function:
type ID OPAR param CPAR block
;
type:
INT
|CHAR
|SHORT INT
|FLOAT
|LONG
|DOUBLE
|UNSIGNED INT
|UNSIGNED LONG
|LONG DOUBLE
|UNSIGNED CHAR
|VOID
;
param:
param COMMA type ID
|type ID
|
;
block:
OBRACK statements CBRACK
;
statements:
statements statement
|
;
statement:
dec_statement
|assign_statement
|functioncall
|condition_statement
|loop_statement
|DELIM
;
assign_statement:
ID EQUAL expr
|ID ADD EQUAL expr
|ID SUB EQUAL expr
|ID MUL EQUAL expr
|ID DIV EQUAL expr
;
expr:
para
| expr ADD expr
| expr SUB expr
| expr MUL expr
| expr DIV expr
| OPAR expr CPAR
;
para:
ID
|num_type
num_type:
NUMBER
|FLOATNUM
;
functioncall:
ID OPAR func_par_list CPAR DELIM
;
func_par_list:
func_par_list COMMA para
|para
|
;
condition_statement:
if_con
|switch_con
;
if_con:
IF OPAR condition CPAR st_block
|IF OPAR condition CPAR st_block ELSE st_block
;
condition:
condition AND condition
|condition OR condition
|NOT condition
|para LT para
|para GT para
|para LTE para
|para GTE para
|para EQL para
|OPAR condition CPAR
;
st_block:
OBRACK statements CBRACK
|statement
;
switch_con:
SWITCH OPAR ID CPAR case_block
;
case_block:
case_block CASE para COLON statements
|
;
loop_statement:
for_loop
|while_loop
|do_loop
;
for_loop:
FOR OPAR dec_statement condition statement CPAR st_block
;
while_loop:
WHILE OPAR condition CPAR st_block
;
do_loop:
DO st_block WHILE OPAR condition CPAR DELIM
;
%%
void yyerror(char *s)
{
int i;
fprintf(stderr,"%s \t %d \n",s,lino);
/* while( (c = fgetc(yyin)) != ';')
{
printf("%c\n",c);
scanf("%c",&c);
lseek(yyin,-3,SEEK_CUR);
}
fputs("*",yyin);
while( fgetc(yyin) == ';' );
fputs("",yyin); */
while((i=yylex())!=DELIM)
{
if(i==0)
exit(0);
}
// lseek(yyin,0,SEEK_SET);
yyparse();
return;
}
int main(void)
{
yyin = fopen("inp.txt","rw");
yyout = fopen("op.txt","w");
yyparse();
return 0;
}