built in functions
YACC built-in functions
First, make sure you have Flex installed:
For installing on Ubuntu- sudo apt-get install flex bison
How to Compile and Run:
Clean and rebuild:
Plain Text
Copy
yacc -d parser.y
lex lexer.l
gcc lex.yy.c y.tab.c -o function_evaluator -lm
./function_evaluator
Assembly
Copy
---Save as lexer.l---
%{
#include "y.tab.h"
#include <math.h>
#include <string.h>
#include <stdlib.h>
%}
%%
"sqrt" { return SQRT; }
"strlen" { return STRLEN; }
"print" { return PRINT; }
[a-zA-Z] { yylval.var = yytext[0]; return VARIABLE; }
[0-9]+ { yylval.dval = atof(yytext); return NUMBER; }
\"[^\"]*\" { yylval.str = strdup(yytext); return STRING; }
[ \t] ; /* ignore whitespace */
\n { return '\n'; }
= { return '='; }
. { return yytext[0]; }
%%
int yywrap() {
return 1;
}
Assembly
Copy
---Save as parser.y---
%{
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
int yylex();
void yyerror(char *);
/* Symbol table - now using double for all values */
double variables[26];
%}
%union {
char var;
double dval;
char* str;
}
%token <var> VARIABLE
%token <dval> NUMBER
%token <str> STRING
%token SQRT STRLEN PRINT
%type <dval> expr
%%
input: /* empty */
| input line
;
line: assignment '\n'
| print '\n'
| '\n'
;
assignment: VARIABLE '=' expr {
variables[$1-'a'] = $3;
}
;
print: PRINT expr {
printf("Result: %g\n", $2);
}
;
expr: NUMBER { $$ = $1; }
| VARIABLE { $$ = variables[$1-'a']; }
| SQRT '(' expr ')' { $$ = sqrt($3); }
| STRLEN '(' STRING ')' {
$$ = (double)(strlen($3)-2); /* subtract 2 for quotes */
free($3);
}
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
| '(' expr ')' { $$ = $2; }
;
%%
void yyerror(char *s) {
fprintf(stderr, "Error: %s\n", s);
}
int main() {
/* Initialize variables to 0 */
for (int i = 0; i < 26; i++) {
variables[i] = 0.0;
}
printf("Enter expressions (e.g., 'u = sqrt(36)' or 'print strlen(\"pune\")'):\n");
yyparse();
return 0;
}
Plain Text
Copy
u = sqrt(36)
print u
v = strlen("pune")
print v
Comments
Post a Comment