as_parser.h 1021 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include "as_tokenizer.h"
  2. // BNF
  3. // ===
  4. //
  5. // <prog> ::= <stmts>
  6. // <stmts> ::= <stmt> <newline> | <stmt> <stmts>
  7. // <stmt> ::= <tag> <instr> | <instr> | <tag>
  8. // <instr> ::= <op> | <op> <arg> | <op> <label>
  9. // <tag> ::= <label> :
  10. // <op> ::= add | sub | mul | div | mod | eq
  11. enum op {
  12. ADD, SUB, MUL, DIV, MOD, EQ
  13. };
  14. typedef enum op Op;
  15. struct arg {
  16. int64_t ival;
  17. double fval;
  18. const char *sval;
  19. };
  20. typedef struct arg Arg;
  21. struct instr {
  22. Op op;
  23. Arg* arg;
  24. const char* labelName;
  25. };
  26. typedef struct instr Instr;
  27. struct label {
  28. const char* name;
  29. };
  30. typedef struct label Label;
  31. struct stmt {
  32. Label* tag;
  33. Instr* instr;
  34. };
  35. typedef struct stmt Stmt;
  36. struct stmts {
  37. Stmt** stmts;
  38. };
  39. typedef struct stmts Stmts;
  40. struct prog {
  41. Stmts *stmts;
  42. };
  43. typedef struct prog Prog;
  44. Prog* parseProg(TokenStream *ts);
  45. Stmt* parseStmt(TokenStream *ts);
  46. Stmts* parseStmts(TokenStream *ts);
  47. Instr* parseInstr(TokenStream *ts);
  48. Label* parseLabel(TokenStream *ts);
  49. Op parseOp(TokenStream *ts);