aboutsummaryrefslogtreecommitdiff
path: root/src/as_parser.h
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-03-02 19:28:26 +0800
committerMistivia <i@mistivia.com>2025-03-02 19:28:26 +0800
commit2c228ecb7d373fd3a7150768302ce0ade6714246 (patch)
treeeebe1f7a9ce6cbef639cd777bb014553848b558d /src/as_parser.h
parentb747628cbfba50fe3d74f7b8ed316d0bd2d56bdc (diff)
add parser
Diffstat (limited to 'src/as_parser.h')
-rw-r--r--src/as_parser.h59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/as_parser.h b/src/as_parser.h
new file mode 100644
index 0000000..268f45a
--- /dev/null
+++ b/src/as_parser.h
@@ -0,0 +1,59 @@
+#include "as_tokenizer.h"
+
+// BNF
+// ===
+//
+// <prog> ::= <stmts>
+// <stmts> ::= <stmt> <newline> | <stmt> <stmts>
+// <stmt> ::= <tag> <instr> | <instr> | <tag>
+// <instr> ::= <op> | <op> <arg> | <op> <label>
+// <tag> ::= <label> :
+// <op> ::= add | sub | mul | div | mod | eq
+
+enum op {
+ ADD, SUB, MUL, DIV, MOD, EQ
+};
+typedef enum op Op;
+
+struct arg {
+ int64_t ival;
+ double fval;
+ const char *sval;
+};
+typedef struct arg Arg;
+
+struct instr {
+ Op op;
+ Arg* arg;
+ const char* labelName;
+};
+typedef struct instr Instr;
+
+struct label {
+ const char* name;
+};
+typedef struct label Label;
+
+struct stmt {
+ Label* tag;
+ Instr* instr;
+};
+typedef struct stmt Stmt;
+
+struct stmts {
+ Stmt** stmts;
+};
+typedef struct stmts Stmts;
+
+struct prog {
+ Stmts *stmts;
+};
+typedef struct prog Prog;
+
+Prog* parseProg(TokenStream *ts);
+Stmt* parseStmt(TokenStream *ts);
+Stmts* parseStmts(TokenStream *ts);
+Instr* parseInstr(TokenStream *ts);
+Label* parseLabel(TokenStream *ts);
+Op parseOp(TokenStream *ts);
+