Saturday, December 4, 2010

Recognization of IF ELSE/WHILE/DO WHILE Statements

LEX PROGRAM

%{
%}
ID [A-Za-z][A-Za-z0-9]*
DIGIT [0-9]+
%%
"if" {return IF;}
"else" {return ELSE;}
"while" {return WHILE;}
"do" {return DO;}
{ID} {return ID;}
{DIGIT} {return DIGIT;}
"+"|"-"|"*"|"/"|"<"|">"|"<="|">="|"||"|"&&"|"=="|"%"|"!=" {return OPERATOR;}
"}" {return *yytext;}
"{" {return *yytext;}
")" {return *yytext;}
"(" {return *yytext;}
";" {return *yytext;}
[\t\n] { ;}
%%
int yywrap()
{
return 1;
}



YACC PROGRAM



%{
#include
%}
%token DIGIT
%token OPERATOR
%token IF
%token ELSE
%token WHILE
%token ID
%token DO
%%
START :while_stmt{printf("success");}
|if_stmt{printf("success");}
|dowhile_stmt{printf("success");}
|error {printf("not correct");}
;
dowhile_stmt:DO'{'stmt_list'}'WHILE'('E')'';'
|DO E';'WHILE'('E')'';'
;
while_stmt:WHILE'('E')''{'stmt_list'}'
|WHILE'('E')'';'
|WHILE'('E')'E';'
;
if_stmt:IF'('E')''{'stmt_list'}'
|IF'('E')''{'stmt_list'}'ELSE'{'stmt_list'}'
|IF'('E')'';'
|IF'('E')'E';'
|IF'('E')'';'ELSE';'
|IF'('E')'E';'ELSE';'
;
stmt_list:stmt_list E';'
|E ';'
|if_stmt
|while_stmt
|dowhile_stmt
|
;
E:E OPERATOR E
|ID
|DIGIT
|'('E')'
;
%%
#include "lex.yy.c"
int yyerror(char *s)
{
fprintf(stderr,"%s is error\n",s);
return 1;
}
int main()
{
yyin=fopen("input","r");
yyparse();
fclose(yyin);
return 0;
}

No comments:

Post a Comment