%{
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
%}
%option noyywrap
/* Regular Expressions Section */
dig [0-9]+(\.[0-9]+)? /* Match numbers including decimals */
add "+" /* Match addition operator */
sub "-" /* Match subtraction operator */
mul "*" /* Match multiplication operator */
div "/" /* Match division operator */
pow "^" /* Match exponentiation operator */
ln \n /* Match newline to print result */
/* Rules Section */
%%
{dig} {digi();} /* Process numbers */
{add
} {op=1;} /* Set operation to addition */ {sub
} {op=2;} /* Set operation to subtraction */ {mul
} {op=3;} /* Set operation to multiplication */ {div
} {op=4;} /* Set operation to division */ {pow
} {op=5;} /* Set operation to exponentiation */ {ln} {printf("\nThe Answer: %f\n\n", a);} /* Print result on new line */
/* C Code Section */
%%
void digi() {
} else {
b
= atof
(yytext
); // Convert the second
number to
float case 1: a = a + b; break; // Addition
case 2: a = a - b; break; // Subtraction
case 3: a = a * b; break; // Multiplication
case 4:
if (b == 0) {
printf("Error: Division by zero\n");
exit(1); // Exit on division by zero
}
a = a / b; break; // Division
case 5: a = pow(a, b); break; // Exponentiation
}
op = 0; // Reset the operation after executing
}
}
int main(int argc, char *argv[]) {
yylex
(); // Call Lex to start scanning
return 0;
}
int yywrap() {
return 1; // Indicates end of input for Lex
}
JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KCmludCBvcCA9IDA7CmZsb2F0IGEsIGI7CiV9Cgolb3B0aW9uIG5veXl3cmFwCgovKiBSZWd1bGFyIEV4cHJlc3Npb25zIFNlY3Rpb24gKi8KZGlnIFswLTldKyhcLlswLTldKyk/ICAgLyogTWF0Y2ggbnVtYmVycyBpbmNsdWRpbmcgZGVjaW1hbHMgKi8KYWRkICIrIiAgICAgICAgICAgICAgICAgLyogTWF0Y2ggYWRkaXRpb24gb3BlcmF0b3IgKi8Kc3ViICItIiAgICAgICAgICAgICAgICAgLyogTWF0Y2ggc3VidHJhY3Rpb24gb3BlcmF0b3IgKi8KbXVsICIqIiAgICAgICAgICAgICAgICAgLyogTWF0Y2ggbXVsdGlwbGljYXRpb24gb3BlcmF0b3IgKi8KZGl2ICIvIiAgICAgICAgICAgICAgICAgLyogTWF0Y2ggZGl2aXNpb24gb3BlcmF0b3IgKi8KcG93ICJeIiAgICAgICAgICAgICAgICAgLyogTWF0Y2ggZXhwb25lbnRpYXRpb24gb3BlcmF0b3IgKi8KbG4gXG4gICAgICAgICAgICAgICAgICAgLyogTWF0Y2ggbmV3bGluZSB0byBwcmludCByZXN1bHQgKi8KCi8qIFJ1bGVzIFNlY3Rpb24gKi8KJSUKe2RpZ30ge2RpZ2koKTt9ICAgICAgICAgICAvKiBQcm9jZXNzIG51bWJlcnMgKi8Ke2FkZH0ge29wPTE7fSAgICAgICAgICAgICAvKiBTZXQgb3BlcmF0aW9uIHRvIGFkZGl0aW9uICovCntzdWJ9IHtvcD0yO30gICAgICAgICAgICAgLyogU2V0IG9wZXJhdGlvbiB0byBzdWJ0cmFjdGlvbiAqLwp7bXVsfSB7b3A9Mzt9ICAgICAgICAgICAgIC8qIFNldCBvcGVyYXRpb24gdG8gbXVsdGlwbGljYXRpb24gKi8Ke2Rpdn0ge29wPTQ7fSAgICAgICAgICAgICAvKiBTZXQgb3BlcmF0aW9uIHRvIGRpdmlzaW9uICovCntwb3d9IHtvcD01O30gICAgICAgICAgICAgLyogU2V0IG9wZXJhdGlvbiB0byBleHBvbmVudGlhdGlvbiAqLwp7bG59IHtwcmludGYoIlxuVGhlIEFuc3dlcjogJWZcblxuIiwgYSk7fSAgLyogUHJpbnQgcmVzdWx0IG9uIG5ldyBsaW5lICovCgovKiBDIENvZGUgU2VjdGlvbiAqLwolJQoKdm9pZCBkaWdpKCkgewogICAgaWYgKG9wID09IDApIHsKICAgICAgICBhID0gYXRvZih5eXRleHQpOyAgLy8gQ29udmVydCB0aGUgZmlyc3QgbnVtYmVyIHRvIGZsb2F0CiAgICB9IGVsc2UgewogICAgICAgIGIgPSBhdG9mKHl5dGV4dCk7ICAvLyBDb252ZXJ0IHRoZSBzZWNvbmQgbnVtYmVyIHRvIGZsb2F0CiAgICAgICAgc3dpdGNoIChvcCkgewogICAgICAgICAgICBjYXNlIDE6IGEgPSBhICsgYjsgYnJlYWs7ICAgLy8gQWRkaXRpb24KICAgICAgICAgICAgY2FzZSAyOiBhID0gYSAtIGI7IGJyZWFrOyAgIC8vIFN1YnRyYWN0aW9uCiAgICAgICAgICAgIGNhc2UgMzogYSA9IGEgKiBiOyBicmVhazsgICAvLyBNdWx0aXBsaWNhdGlvbgogICAgICAgICAgICBjYXNlIDQ6IAogICAgICAgICAgICAgICAgaWYgKGIgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3I6IERpdmlzaW9uIGJ5IHplcm9cbiIpOwogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7ICAvLyBFeGl0IG9uIGRpdmlzaW9uIGJ5IHplcm8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGEgPSBhIC8gYjsgYnJlYWs7ICAgLy8gRGl2aXNpb24KICAgICAgICAgICAgY2FzZSA1OiBhID0gcG93KGEsIGIpOyBicmVhazsgIC8vIEV4cG9uZW50aWF0aW9uCiAgICAgICAgfQogICAgICAgIG9wID0gMDsgLy8gUmVzZXQgdGhlIG9wZXJhdGlvbiBhZnRlciBleGVjdXRpbmcKICAgIH0KfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgeXlsZXgoKTsgIC8vIENhbGwgTGV4IHRvIHN0YXJ0IHNjYW5uaW5nCiAgICByZXR1cm4gMDsKfQoKaW50IHl5d3JhcCgpIHsKICAgIHJldHVybiAxOyAgLy8gSW5kaWNhdGVzIGVuZCBvZiBpbnB1dCBmb3IgTGV4Cn0K