Creation of Parser for a Sample Language using Lex &Yacc.
Basic Version for Parsing simple c++ code
[duke@duke-pc a4]$ yacc -d a4.y
[duke@duke-pc a4]$ lex a4.l
[duke@duke-pc a4]$ gcc y.tab.c lex.yy.c
[duke@duke-pc a4]$ ./a.out
Preprocessor Statement
MainBlock
Basic Version for Parsing simple c++ code
Lex
%{
#include<stdio.h>
# include "y.tab.h"
extern int yylval;
%}
digit [0-9]
char [A-Za-z_]
identifier {char}({char}|{digit})*
white " "|\t|\n
%%
{white} ;
#include<{identifier}.h> {return PRE;}
int|float {return DT;}
\(|\)|\}|\{|; {return yytext[0];}
return {return RET;}
{digit}+ {return INT;}
main {return MAIN;}
%%
int yywrap(){
return 1;
}
Yacc
%{
#include<stdio.h>
#include<stdlib.h>
#include"y.tab.h"
extern FILE* yyin;
void yyerror(char *s);
int yylex();
%}
%token PRE DT RET INT MAIN
%%
s: preprocessor mainblock;
preprocessor: PRE {printf("Preprocessor Statement\n");};
mainblock: DT MAIN '('')''{' RET INT ';''}' {printf("MainBlock\n");}
%%
void yyerror(char *s){
printf("error %s",s);
}
int main(){
yyin = fopen("input.c","r");
yyparse();
return 0;
}
Input
#include<stdio.h>
int main(){
return 0;
}
Output
[duke@duke-pc a4]$ lex a4.l
[duke@duke-pc a4]$ gcc y.tab.c lex.yy.c
[duke@duke-pc a4]$ ./a.out
Preprocessor Statement
MainBlock
Additional Rules
Add additional rules as per your wish. Make sure to test after every two rules. Debugging Lex & Yacc can be a pain in the ass.
No comments:
Post a Comment