From 5bc38338c79ef313f639696ec85e424c5d9c0b0c Mon Sep 17 00:00:00 2001 From: Julian T Date: Thu, 24 Oct 2019 09:17:29 +0200 Subject: Added regn2 --- sem1/osc/mm11/opgaver.md | 4 ++++ sem1/osc/mm11/regn2/Makefile | 30 +++++++++++++++++++++++++++++ sem1/osc/mm11/regn2/regn.l | 27 ++++++++++++++++++++++++++ sem1/osc/mm11/regn2/regn.y | 46 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+) create mode 100644 sem1/osc/mm11/regn2/Makefile create mode 100644 sem1/osc/mm11/regn2/regn.l create mode 100644 sem1/osc/mm11/regn2/regn.y diff --git a/sem1/osc/mm11/opgaver.md b/sem1/osc/mm11/opgaver.md index 8fab5c4..276236a 100644 --- a/sem1/osc/mm11/opgaver.md +++ b/sem1/osc/mm11/opgaver.md @@ -26,3 +26,7 @@ Denne laver jeg måske senere. Denne er løst i regn mappen. Kør `make run` deri for at køre. + +# Opgave 4 + +I regn2 mappen diff --git a/sem1/osc/mm11/regn2/Makefile b/sem1/osc/mm11/regn2/Makefile new file mode 100644 index 0000000..9640aaa --- /dev/null +++ b/sem1/osc/mm11/regn2/Makefile @@ -0,0 +1,30 @@ + +LEX=flex +YACC=bison +LIBS=-ly -lfl -lm +CC=gcc + +PROG=regn +TRASH=lex.yy.c $(PROG).tab.c $(PROG) $(PROG).tab.h $(PROG).output + +$(PROG): $(PROG).tab.o lex.yy.o + $(CC) -o $@ $^ $(LIBS) + +$(PROG).tab.c $(PROG).tab.h: $(PROG).y + $(YACC) -d -v $(PROG).y + +lex.yy.c: $(PROG).l + $(LEX) $(PROG).l + +%.o: %.c + $(CC) -c -o $@ $^ + +PHONY: clean run + +run: $(PROG) + ./$(PROG) + +clean: + rm -f *.o + rm -f $(TRASH) + diff --git a/sem1/osc/mm11/regn2/regn.l b/sem1/osc/mm11/regn2/regn.l new file mode 100644 index 0000000..9988ddd --- /dev/null +++ b/sem1/osc/mm11/regn2/regn.l @@ -0,0 +1,27 @@ +%{ +#include +#include +#include "regn.tab.h" +%} + +realtal ([0-9]+|([0-9]*\.[0-9]+))([eE][-+]?[0-9]+)? +op_log log +op_exp exp +op_sqrt sqrt + +%% +{realtal} {yylval.dval = atof(yytext); + return TAL;} +{op_log} {return LOG;} +{op_exp} {return EXP;} +{op_sqrt} {return SQRT;} + +[ \t] ; + + +'$' {return 0;} + +\n|. {return yytext[0];} + +%% + diff --git a/sem1/osc/mm11/regn2/regn.y b/sem1/osc/mm11/regn2/regn.y new file mode 100644 index 0000000..a181cb3 --- /dev/null +++ b/sem1/osc/mm11/regn2/regn.y @@ -0,0 +1,46 @@ +%{ +#include +#include +#include +%} + +%union { + double dval; +} + +%token TAL +%token LOG EXP SQRT + +%left '-' '+' +%left LOG EXP SQRT +%left '*' '/' +%right UMINUS + +%type expression + +%% + +statement_list: statement '\n' + | statement_list statement '\n' ; + +statement: expression {;}; + +expression: expression '+' expression {printf("sum \n");} + | expression '-' expression {printf("sub \n");} + | expression '*' expression {printf("mul \n");} + | expression '/' expression {if ($3 == 0.0) + yyerror("divide dy zero"); + else printf("div \n");} + | '-' expression %prec UMINUS {printf("neg \n");} + | '(' expression ')' {;} + | LOG expression {printf("log \n");} + | EXP expression {printf("exp \n");} + | SQRT expression {printf("sqrt \n");} + | TAL {printf("load %f \n", $$);}; +%% + +int main() +{ + yyparse(); +} + -- cgit v1.2.3