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 }