From 1a5cd97ef6070d37a7fe7272d32c1849cf609513 Mon Sep 17 00:00:00 2001 From: JuanAndresA016 <141958626+JuanAndresA016@users.noreply.github.com> Date: Sun, 13 Apr 2025 20:25:52 -0600 Subject: [PATCH] Add files via upload --- labs/04/calculator_v2_linux_zoo/Makefile | 22 ++--- labs/04/calculator_v2_linux_zoo/simplecalc.l | 41 +++++---- labs/04/calculator_v2_linux_zoo/simplecalc.y | 93 ++++++++++++++------ 3 files changed, 101 insertions(+), 55 deletions(-) diff --git a/labs/04/calculator_v2_linux_zoo/Makefile b/labs/04/calculator_v2_linux_zoo/Makefile index 0e2d203a..abf27f5b 100644 --- a/labs/04/calculator_v2_linux_zoo/Makefile +++ b/labs/04/calculator_v2_linux_zoo/Makefile @@ -1,11 +1,11 @@ -all: - yacc -d simplecalc.y - lex simplecalc.l - gcc y.tab.c lex.yy.c -o simplecalc - -clean: - rm -rf simplecalc - rm -rf lex.yy.c - rm -rf y.tab.c - rm -rf y.tab.h - rm -rf y.tab.h.gch +all: + yacc -d simplecalc.y + lex simplecalc.l + gcc y.tab.c lex.yy.c -o simplecalc + +clean: + rm -rf simplecalc + rm -rf lex.yy.c + rm -rf y.tab.c + rm -rf y.tab.h + rm -rf y.tab.h.gch \ No newline at end of file diff --git a/labs/04/calculator_v2_linux_zoo/simplecalc.l b/labs/04/calculator_v2_linux_zoo/simplecalc.l index 02a5db52..490261eb 100644 --- a/labs/04/calculator_v2_linux_zoo/simplecalc.l +++ b/labs/04/calculator_v2_linux_zoo/simplecalc.l @@ -1,16 +1,25 @@ -%{ -#include "y.tab.h" -extern int yylval; - -%} - -%option noyywrap - - -%% -[0-9]+ { yylval = atoi(yytext); return NUMBER; } -[a-z] { yylval = yytext[0]; return NAME; } -[ \t] ; /* ignore whitespace */ -\n return 0; /* logical EOF */ -. return yytext[0]; -%% +%{ +#include +#include +#include "y.tab.h" +%} + +%option noyywrap + +%% +"//".* { printf("COMMENT "); return '\n'; } +"f" { printf("floatdcl "); return FLOATDCL; } +[a-eghj-oq-z] { printf("id "); yylval.sval = yytext[0]; return NAME;} +"i" { printf("intdcl "); return INTDCL; } +"=" { printf("assign "); return '=';} +[0-9]+ { printf("inum "); yylval.dval = atoi(yytext); return NUMBER;} +"+" { printf("plus "); return '+'; } +"*" { printf("times "); return '*'; } +"-" { printf("minus "); return '-'; } +"/" { printf("divided" ); return '/'; } +[0-9]+"."[0-9]+ { printf("fnum "); yylval.dval = atof(yytext); return NUMBER; } +"p" { printf("print "); return PRINT;} +[ \t] ; /* ignore whitespace */ +\n { return '\n'; } /* logical EOF */ +. { return yytext[0]; } +%% diff --git a/labs/04/calculator_v2_linux_zoo/simplecalc.y b/labs/04/calculator_v2_linux_zoo/simplecalc.y index d0505c33..3f36b2e4 100644 --- a/labs/04/calculator_v2_linux_zoo/simplecalc.y +++ b/labs/04/calculator_v2_linux_zoo/simplecalc.y @@ -1,28 +1,65 @@ -%{ -#include -int yylex(); - void yyerror (char const *s) { - fprintf (stderr, "%s\n", s); - } -%} - - -%token NAME NUMBER -%% - -statement: NAME '=' expression {printf("%c = %d\n", $1,$3);} - | expression {printf("= %d\n", $1);} - ; -expression: expression '+' NUMBER { $$ = $1 + $3;} - | expression '-' NUMBER { $$ = $1 - $3;} - | expression '*' NUMBER { $$ = $1 * $3;} - | '(' expression ')' {$$ = $2;} - | NUMBER {$$ = $1;} - ; - -%% - -int main(){ - yyparse(); - return 0; -} +%{ +#include +#include +int yylex(); +void yyerror(const char *s) { + fprintf(stderr, "Error: %s\n", s); +} + +double varvalue[26]; +%} + +%union { + double dval; + char sval; +} + +%token NAME +%token NUMBER +%token FLOATDCL PRINT INTDCL +%type expression + +%left '+' '-' +%left '*' '/' + +%% + +input: + | input '\n' + | input statement '\n' + ; + +statement: FLOATDCL NAME + | INTDCL NAME + | NAME '=' expression { varvalue[$1 - 'a'] = $3; } + | PRINT NAME { printf("%f\n", varvalue[$2 - 'a']); } + ; + +expression: + expression '+' expression { $$ = $1 + $3; } + | expression '-' expression { $$ = $1 - $3; } + | expression '*' expression { $$ = $1 * $3; } + | expression '/' expression { $$ = $1 / $3; } + | '(' expression ')' { $$ = $2; } + | NUMBER { $$ = $1; } + | NAME { $$ = varvalue[$1 - 'a']; } + ; + +%% + +int main(int argc, char **argv) { + FILE *fd; + + if (argc == 2) { + if (!(fd = fopen(argv[1], "r"))) { + perror("Error: "); + return -1; + } + yyset_in(fd); + yyparse(); + fclose(fd); + } else { + printf("Usage: %s filename\n", argv[0]); + } + return 0; +}