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:
Copy
yacc -d parser.y lex lexer.l gcc lex.yy.c y.tab.c -o function_evaluator -lm ./function_evaluator
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; }
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; }
Copy
u = sqrt(36) print u v = strlen("pune") print v

Comments

Popular posts from this blog

literal

yacc evaluate