Witam mam za zadanie stworzenie parsera analizującego wyrażenie matematyczne. Jako skaner używam lexa. Dotychczas stworzyłem rozwiazywanie prostych rozwiązań (dodawanie odejmowanie mnożenie dzielenie) z kolejnością wykonywania działań również biorąc pod uwagę nawiasy. Jednak w treści polecenia mam również ująć działania na ułamkach wymiernych.
SKANER:
%{
#include <stdio.h>
#include <stdlib.h>
#include "parser.tab.h"
%}
digit [0-9]
digits {digit}+
plus_op "+"
minus_op "-"
mult_op "*"
div_op "/"
op_bracket "("
cl_bracket ")"
dec_num {digits}
frac_op "|"
fraction {digits}{frac_op}{digits}
%%
{dec_num} { yylval = strtol(yytext,NULL,10); return CALKOWITA; }
{fraction} { recturn ULAM; }
{plus_op} { return PLUS; }
{minus_op} { return MINUS; }
{mult_op} { return MNOZ; }
{div_op} { return DZIEL; }
{op_bracket} { return OTW; }
{cl_bracket} { return ZAM; }
\n { return yytext[0]; }
%%
Parser:
%{
#include <stdio.h>
#include <string.h>
int yyerror();
int numExpressions = 0;
%}
%token LICZBA CALKOWITA PLUS MINUS MNOZ DZIEL OTW ZAM ULAM
%%
calosc :
| calosc wiersz
;
wiersz : '\n'
| wyrazenie '\n' { printf("wartosc = %d\n",$1); ++numExpressions; }
wyrazenie : wyrazenie PLUS skladnik { $$ = $1 + $3; }
| wyrazenie MINUS skladnik { $$ = $1 - $3; }
| skladnik { $$ = $1; }
;
skladnik : skladnik MNOZ czynnik { $$ = $1 * $3; }
| skladnik DZIEL czynnik { $$ = $1 / $3; }
| czynnik
;
czynnik : liczba { $$ = $1; }
| OTW wyrazenie ZAM { $$ = $2; }
liczba : CALKOWITA { $$ = $1; }
| MINUS CALKOWITA {$$ = -$2; }
;
%%
int main() {
printf("Poczatek skanowania ...\n");
yyparse();
printf("\nKoniec skanowania\n");
printf("\tprzeczytano %d poprawnych wyrazen\n\n",numExpressions);
return 0;
}
int yyerror(char *s) {
printf("Blad: %s\n", s);
}