pow

 

YACC pow(), log()

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 flex lexer.l gcc lex.yy.c y.tab.c -o math_evaluator -lm ./math_evaluator
Copy
---Save as lexer.l--- %{ #include "y.tab.h" #include <math.h> void yyerror(char *); %} %% "pow" { return POW; } "log" { return LOG; } "print" { return PRINT; } [a-zA-Z] { yylval.var = yytext[0]; return VARIABLE; } [0-9]+(\.[0-9]*)? { yylval.dval = atof(yytext); return NUMBER; } [ \t] ; \n { return '\n'; } = { return '='; } "+" { return '+'; } "-" { return '-'; } "*" { return '*'; } "/" { return '/'; } "(" { return '('; } ")" { return ')'; } "," { return ','; } . { yyerror("Invalid character"); return 0; } %% int yywrap() { return 1; }
Copy
---Save as parser.y--- %{ #include <stdio.h> #include <math.h> int yylex(); void yyerror(char *); double variables[26] = {0}; %} %union { char var; double dval; } %token <var> VARIABLE %token <dval> NUMBER %token POW LOG PRINT %left '+' '-' %left '*' '/' %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: %.15g\n", $2); } ; expr: NUMBER { $$ = $1; } | VARIABLE { $$ = variables[$1-'a']; } | POW '(' expr ',' expr ')' { $$ = pow($3, $5); } | LOG '(' expr ')' { $$ = log($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() { printf("Enter expressions (e.g., 'p = pow(3,2)/log(24)'):\n"); printf("Note: log() is natural logarithm (base e)\n"); yyparse(); return 0; }

Comments

Popular posts from this blog

literal

yacc evaluate

built in functions