aboutsummaryrefslogtreecommitdiff
path: root/works/life/compile-principle-experiment/3
diff options
context:
space:
mode:
Diffstat (limited to 'works/life/compile-principle-experiment/3')
-rw-r--r--works/life/compile-principle-experiment/3/lex.l17
-rw-r--r--works/life/compile-principle-experiment/3/main.c107
-rw-r--r--works/life/compile-principle-experiment/3/main.h25
-rw-r--r--works/life/compile-principle-experiment/3/makefile22
-rw-r--r--works/life/compile-principle-experiment/3/syn.y42
5 files changed, 0 insertions, 213 deletions
diff --git a/works/life/compile-principle-experiment/3/lex.l b/works/life/compile-principle-experiment/3/lex.l
deleted file mode 100644
index ddea92d..0000000
--- a/works/life/compile-principle-experiment/3/lex.l
+++ /dev/null
@@ -1,17 +0,0 @@
-%{
-#include "main.h"
-#include "syn.h"
-%}
-%option noyywrap
-%%
-[ \t] { ; } /* skip blanks and tabs */
-[0-9]+\.?|[0-9]*\.[0-9]+ {
- sscanf(yytext, "%lf", &yylval.val); return NUMBER; }
-[a-zA-Z][a-zA-Z0-9]* {
- Symbol *s;
- if ((s=cru_symbol_lookup(yytext)) == 0)
- s = cru_symbol_install(yytext, UNDEF, (SymbolValue)0.0);
- yylval.sym = s;
- return s->type == UNDEF ? VAR : s->type; }
-\n { lineno++; return '\n'; } /* everything else */
-. { return yytext[0]; }
diff --git a/works/life/compile-principle-experiment/3/main.c b/works/life/compile-principle-experiment/3/main.c
deleted file mode 100644
index 7cd8c28..0000000
--- a/works/life/compile-principle-experiment/3/main.c
+++ /dev/null
@@ -1,107 +0,0 @@
-#include "main.h"
-
-#include "syn.h"
-
-#include <errno.h>
-#include <math.h>
-#include <setjmp.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-static Symbol *symlist = 0; /* symbol table: linked list */
-
-void *emalloc(size_t n) /* check return from malloc */
-{
- void *p = malloc(n);
- if (p == 0)
- execerror("out of memory", (char *)0);
- return p;
-}
-
-Symbol *cru_symbol_lookup(const char *name) {
- for (Symbol *sp = symlist; sp != NULL; sp = sp->next)
- if (strcmp(sp->name, name) == 0)
- return sp;
- return NULL;
-}
-
-Symbol *cru_symbol_install(const char *name, int type, SymbolValue value) {
- Symbol *sp = (Symbol *)emalloc(sizeof(Symbol));
- sp->name = emalloc(strlen(name) + 1);
- strcpy(sp->name, name);
- sp->type = type;
- sp->value = value;
- sp->next = symlist;
- symlist = sp;
- return sp;
-}
-
-jmp_buf begin;
-int lineno;
-
-void warning(const char *s, const char *t) {
- fprintf(stderr, "%s", s);
- if (t)
- fprintf(stderr, " %s", t);
- fprintf(stderr, " near line %d\n", lineno);
-}
-
-void yyerror(const char *s) { warning(s, NULL); }
-
-void execerror(const char *s, const char *t) {
- warning(s, t);
- longjmp(begin, 0);
-}
-
-double errcheck(double result, const char *name) {
- if (errno == EDOM) {
- errno = 0;
- execerror(name, "argument out of domain");
- } else if (errno == ERANGE) {
- errno = 0;
- execerror(name, "result out of range");
- }
- return result;
-}
-
-double Log(double x) { return errcheck(log(x), "log"); }
-double Log10(double x) { return errcheck(log10(x), "log10"); }
-double Sqrt(double x) { return errcheck(sqrt(x), "sqrt"); }
-double Exp(double x) { return errcheck(exp(x), "exp"); }
-double Pow(double x, double y) { return errcheck(pow(x, y), "exponentiation"); }
-double integer(double x) { return (double)(long)x; }
-
-static struct { /* Constants */
- char *name;
- double cval;
-} consts[] = {
- {"PI", 3.14159265358979323846}, {"E", 2.71828182845904523536},
- {"GAMMA", 0.57721566490153286060}, {"DEG", 57.29577951308232087680},
- {"PHI", 1.61803398874989484820},
-};
-
-static struct { /* Built-ins */
- char *name;
- double (*func)();
-} builtins[] = {
- {"sin", sin}, {"cos", cos}, {"atan", atan},
- {"log", Log}, {"log10", Log10}, {"exp", Exp},
- {"sqrt", Sqrt}, {"int", integer}, {"abs", fabs},
-};
-
-void init() {
- for (int i = 0; i < sizeof(consts) / sizeof(*consts); i++)
- cru_symbol_install(consts[i].name, VAR, (SymbolValue)consts[i].cval);
- for (int i = 0; i < sizeof(builtins) / sizeof(*builtins); i++) {
- cru_symbol_install(builtins[i].name, BLTIN, (SymbolValue)builtins->func);
- }
-}
-
-int main(int argc, char **argv) {
- init();
- (void)setjmp(begin);
- yyparse();
-
- return 0;
-}
diff --git a/works/life/compile-principle-experiment/3/main.h b/works/life/compile-principle-experiment/3/main.h
deleted file mode 100644
index 9bd6e56..0000000
--- a/works/life/compile-principle-experiment/3/main.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#pragma once
-
-typedef union SymbolValue {
- double val;
- double (*ptr)();
-} SymbolValue;
-
-typedef struct Symbol {
- char *name;
- int type;
- SymbolValue value;
- struct Symbol *next;
-} Symbol;
-
-Symbol *cru_symbol_lookup(const char *name);
-Symbol *cru_symbol_install(const char *name, int type, SymbolValue value);
-
-double Pow(double x, double y);
-
-int yylex();
-int yyparse();
-void yyerror(const char *s);
-
-extern int lineno;
-void execerror(const char *s, const char *t);
diff --git a/works/life/compile-principle-experiment/3/makefile b/works/life/compile-principle-experiment/3/makefile
deleted file mode 100644
index cf6333c..0000000
--- a/works/life/compile-principle-experiment/3/makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-main: main.o lex.o syn.o
- cc lex.o syn.o main.o -o main
-
-main.o: main.c main.h syn.h
- cc -c -o main.o main.c
-
-lex.c: lex.l
- flex -o lex.c lex.l
-
-lex.o: lex.c syn.h main.h
- cc -c -o lex.o lex.c
-
-syn.c syn.h: syn.y
- bison syn.y -d -o syn.c
-
-syn.o: syn.c syn.h main.h
- cc -c -o syn.o syn.c
-
-PHONY: clean
-
-clean:
- rm -f *.o lex.c syn.c syn.h main
diff --git a/works/life/compile-principle-experiment/3/syn.y b/works/life/compile-principle-experiment/3/syn.y
deleted file mode 100644
index 80abb17..0000000
--- a/works/life/compile-principle-experiment/3/syn.y
+++ /dev/null
@@ -1,42 +0,0 @@
-%{
-#include "main.h"
-#include <stdio.h>
-%}
-%union {
- double val; /* actual value */
- Symbol *sym; /* symbol table pointer */
-}
-%token <val> NUMBER
-%token <sym> VAR BLTIN UNDEF
-%type <val> 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; }
- ;
-%%