aboutsummaryrefslogtreecommitdiff
path: root/works/life/compile-principle-experiment/4/main.h
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-12-02 21:59:36 +0800
committercrupest <crupest@outlook.com>2021-12-02 21:59:36 +0800
commit27556004e8e12a72ed1c2c70212f6b660ed798c3 (patch)
tree9191fca88d48c97fce6e777037c93c57c29edad2 /works/life/compile-principle-experiment/4/main.h
parente3fb643403ae71a38cba404e8d548d7a49cfdb88 (diff)
downloadcrupest-27556004e8e12a72ed1c2c70212f6b660ed798c3.tar.gz
crupest-27556004e8e12a72ed1c2c70212f6b660ed798c3.tar.bz2
crupest-27556004e8e12a72ed1c2c70212f6b660ed798c3.zip
import(life): ...
Diffstat (limited to 'works/life/compile-principle-experiment/4/main.h')
-rw-r--r--works/life/compile-principle-experiment/4/main.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/works/life/compile-principle-experiment/4/main.h b/works/life/compile-principle-experiment/4/main.h
new file mode 100644
index 0000000..96bd9e7
--- /dev/null
+++ b/works/life/compile-principle-experiment/4/main.h
@@ -0,0 +1,41 @@
+#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);
+
+typedef union Datum { /* interpreter stack type */
+ double val;
+ Symbol *sym;
+} Datum;
+extern Datum pop();
+int mypop();
+
+typedef int (*Inst)(); /* machine instruction */
+#define STOP (Inst)0
+
+extern Inst prog[];
+extern int eval(), add(), sub(), mul(), mydiv(), negate(), power();
+extern int assign(), bltin(), varpush(), constpush(), print();
+
+extern Inst *code(Inst f);