github.com/skycoinproject/nex@v0.0.0-20191231010827-3bb2d0c49bc5/tacky/tacky.y (about) 1 %{ 2 package main 3 %} 4 5 %union { 6 s string 7 expr *Expr 8 } 9 10 %token DEF_FORM 11 %token ASSIGN 12 %token ID 13 %token MONEY 14 %token FRAC 15 %token XREF 16 %token FUNC 17 %left '+' '-' 18 %left '*' '/' 19 %% 20 input: /* empty */ 21 | input stuff 22 23 stuff: DEF_FORM { cast(yylex).BeginForm($1.s) } 24 | '}' { cast(yylex).EndForm() } 25 | ASSIGN { cast(yylex).Assign($1.s) } 26 | expr { cast(yylex).Expr($1.expr) } 27 28 expr: atom 29 | expr '+' expr { $$.expr = NewOp($2.s, $1.expr, $3.expr) } 30 | expr '-' expr { $$.expr = NewOp($2.s, $1.expr, $3.expr) } 31 | expr '*' expr { $$.expr = NewOp($2.s, $1.expr, $3.expr) } 32 | expr '/' expr { $$.expr = NewOp($2.s, $1.expr, $3.expr) } 33 34 atom: MONEY { $$.expr = NewExpr("$", $1.s) } 35 | ID { $$.expr = NewExpr("ID", $1.s) } 36 | '(' expr ')' { $$.expr = $2.expr } 37 | XREF { $$.expr = NewExpr("XREF", $1.s) } 38 | FUNC arglist ')' { $$.expr = NewFun($1.s, $2.expr) } 39 | FRAC { $$.expr = NewExpr("%", $1.s) } 40 41 arglist: expr { $$.expr = NewExpr("", ""); $$.expr.AddKid($1.expr) } 42 | arglist ',' expr { $1.expr.AddKid($3.expr) } 43 44 %% 45 func cast(y yyLexer) *Tacky { return y.(*Lexer).p }