%{
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int op = 0, i;
float a, b;

// Function prototype
void digi(void);
%}

dig     [0-9]+|([0-9]*)"."([0-9]+)
add     \+
sub     \-
mul     \*
div     /
pow     \^
ln      \n
%%

{dig}   { digi(); }

{add}   { op = 1; }
{sub}   { op = 2; }
{mul}   { op = 3; }
{div}   { op = 4; }
{pow}   { op = 5; }

{ln}    { printf("\nThe result: %f\n\n", a); }

[\t ]+  { /* Ignore whitespace */ }

.       { printf("Unrecognized input: %s\n", yytext); }
%%

void digi()
{
    if (op == 0)
        a = atof(yytext);  // Convert to float
    else
    {
        b = atof(yytext);
        switch(op)
        {
            case 1: a = a + b; break;
            case 2: a = a - b; break;
            case 3: a = a * b; break;
            case 4: 
                if (b != 0)
                    a = a / b; 
                else
                    printf("Error: Division by zero!\n");
                break;
            case 5: 
                a = pow(a, b); 
                break;
        }
        op = 0;
    }
}

int main(int argc, char *argv[])
{
    yylex();
    return 0;
}

int yywrap()
{
    return 1;
}

