All pastes #39094 Raw Edit

rcyac

public text v1 · immutable
#39094 ·published 2006-01-30 03:51 UTC
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;
}