tacky.y 1.1 KB

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