From 99e2e923d0c77b02f3fb4ff648ea916954868606 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Fri, 28 Feb 2025 23:13:39 +0800 Subject: chore(store): move everything to store. --- .../life/compile-principle-experiment/3/syn.y | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 store/works/life/compile-principle-experiment/3/syn.y (limited to 'store/works/life/compile-principle-experiment/3/syn.y') diff --git a/store/works/life/compile-principle-experiment/3/syn.y b/store/works/life/compile-principle-experiment/3/syn.y new file mode 100644 index 0000000..80abb17 --- /dev/null +++ b/store/works/life/compile-principle-experiment/3/syn.y @@ -0,0 +1,42 @@ +%{ +#include "main.h" +#include +%} +%union { + double val; /* actual value */ + Symbol *sym; /* symbol table pointer */ +} +%token NUMBER +%token VAR BLTIN UNDEF +%type expr asgn +%right '=' +%left '+' '-' +%left '*' '/' +%left UNARYMINUS +%right '^' /* exponentiation */ +%% +list: /* nothing */ + | list '\n' + | list asgn '\n' + | list expr '\n' { printf("\t%.8g\n", $2); } + | list error '\n' { yyerrok; } + ; +asgn: VAR '=' expr { $$=$1->value.val=$3; $1->type = VAR; } + ; +expr: NUMBER + | VAR { if ($1->type == UNDEF) + execerror("undefined variable", $1->name); + $$ = $1->value.val; } + | BLTIN '(' expr ')' { $$ = (*($1->value.ptr))($3); } + | expr '+' expr { $$ = $1 + $3; } + | expr '-' expr { $$ = $1 - $3; } + | expr '*' expr { $$ = $1 * $3; } + | expr '/' expr { + if ($3 == 0.0) + execerror("division by zero", ""); + $$ = $1 / $3; } + | expr '^' expr { $$ = Pow($1, $3); } + | '(' expr ')' { $$ = $2; } + | '-' expr %prec UNARYMINUS { $$ = -$2; } + ; +%% -- cgit v1.2.3