Monday, 5 September 2016

Parser for sample language using YACC

Lex File

%{
            #include<stdio.h>
            #include"y.tab.h"
            int line=0;
%}

%%
[ \t]+                            ;
int|float|char                  return DT;
main                             return MAIN;
return                           return RET;
if|for|while|else  return KEYW;
[a-zA-Z][a-zA-Z0-9]* return ID;
[0-9]+                          return NUM;   
[(){},;=]                       return yytext[0];
\n                                 line++;
[><>=<===]                return AOP;
%%
yywrap()
{
return 1;
}

Yacc File

%{
            #include<stdio.h>
            extern FILE *yyin;
            extern int line;
%}

%token DT NUM ID RET MAIN KEYW AOP

%%
Pdash:P                        {printf("\n Parsing Done....No Syntax Error");}

P:DT MAIN '(' ')' '{' S R '}'

S:DS S
 |ES S
 |CS S
 |

DS:DT V ';'
V:ID|V','ID

ES:ID'='E';'
E:NUM|ID

CS:KEYW '(' A ')' '{' S '}'
A:ID AOP ID|ID AOP NUM|';'';'

R :RET NUM';'
%%

int main()
{
            yyin=fopen("input.txt","r");
            yyparse();
}

yyerror()
{
            printf("\n Error at line no:%d",line);
}

Input text file

int main()
{
            int a,b,c;
            b=4;
            a=b;
            if(a>2)
            {
            for(;;)
            {
                        c=2;
            }
            }
            return 0;
}

Output

student@ubuntu:~$ yacc -d parse.y
student@ubuntu:~$ lex lex1.l
student@ubuntu:~$ cc y.tab.c lex.yy.c
student@ubuntu:~$ ./a.out

Parsing Done....No Syntax Error

student@ubuntu:~$

No comments:

Post a Comment