ref: ca99199e72dc182d2801eb591cdf470c707c1e6c
dir: /spirva.y/
%{ #include <u.h> #include "sym.h" #include "asm.h" int debug; extern int yylex(void); extern int yyparse(void); %} %union { uint op; double f; int i; Symbol *sym; char *str; } %token <sym> SYM %token <op> OP %token <f> FLOAT %token <i> INT %token <str> STR %right '=' %% list: /* nothing */ | list '\n' | list SYM '=' oplist '\n' { a_result($2); asm(); } | list oplist '\n' { asm(); } ; oplist: OP arglist { a_op($1); } ; arglist: /* nothing */ | arglist arg ; arg: SYM { a_var($1); } | INT { a_int($1); } | FLOAT { a_float($1); } | str | STR { a_keyword($1); } ; str: '"' STR '"' { a_str($2); } %% /* end of grammar */ #include <libc.h> #include <bio.h> void init(void) { a_init(); } void asm(void) { assemble(); } void main(int argc, char **argv) { ARGBEGIN{ case 'd': debug++; break; }ARGEND; u32int magic = 0x07230203; write(1, &magic, sizeof(u32int)); for (init(); yyparse(); init()) asm(); } void yyerror(char *s) { fprint(2, "error: %s\n", s); }