Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %token ALICE
- %token FOUND
- %token WAS
- %token A
- %token AN
- %token TOO
- %token BECAME
- %token STOP
- %token DELIM
- %token ATE
- %token DRANK
- %token NUMBER
- %token LETTER
- %token IDENT
- %token ADD
- %token SUB
- %token MUL
- %token DIV
- %token MOD
- %token AND
- %token OR
- %token XOR
- %token NOT
- %token LPAR
- %token RPAR
- %{
- enum Statement {
- s_decl (name:String,type:String);
- s_inc (name:String);
- s_dec (name:String);
- s_assign(name:String,value:Expr);
- s_cout (value:Expr);
- }
- enum Op {
- op_add;
- op_sub;
- op_mul;
- op_div;
- op_mod;
- op_and;
- op_or;
- op_xor;
- op_not;
- }
- enum Value {
- v_ident (x:String);
- v_number(x:Int);
- v_letter(x:Int);
- }
- enum Expr {
- e_value (x:Value);
- a_unary (op:Op,b:Expr);
- a_binary(a:Expr,op:Op,b:Expr);
- }
- %}
- start_symbol : program ;
- program : state STOP %{ return [%0]; %}
- | state DELIM program %{ return [%0].concat(%2); %}
- | %{ return []; %}
- ;
- state : IDENT WAS AN IDENT %{ return s_decl (%0,%3); %}
- | IDENT WAS A IDENT %{ return s_decl (%0,%3); %}
- | IDENT WAS expr %{ return s_assign(%0,%2); %}
- | IDENT BECAME expr %{ return s_assign(%0,%2); %}
- | IDENT DRANK %{ return s_dec (%0); %}
- | IDENT ATE %{ return s_inc (%0); %}
- | ALICE FOUND expr %{ return s_cout(%2); %}
- ;
- expr : expr OR e1 %{ return a_binary(%0,op_or,%1); %}
- | e1 %{ return %0; %}
- ;
- e1 : e1 XOR e2 %{ return a_binary(%0,op_xor,%1); %}
- | e2 %{ return %0; %}
- ;
- e2 : e2 AND e3 %{ return a_binary(%0,op_and,%1); %}
- | e3 %{ return %0; %}
- ;
- e3 : e3 ADD e4 %{ return a_binary(%0,op_add,%1); %}
- | e3 SUB e4 %{ return a_binary(%0,op_sub,%1); %}
- | e4 %{ return %0; %}
- ;
- e4 : e4 MUL e5 %{ return a_binary(%0,op_mul,%1); %}
- | e4 DIV e5 %{ return a_binary(%0,op_div,%1); %}
- | e4 MOD e5 %{ return a_binary(%0,op_mod,%1); %}
- | e5 %{ return %0; %}
- ;
- e5 : datum %{ return a_value(%0); %}
- | ADD e5 %{ return a_unary(op_add,%1); %}
- | SUB e5 %{ return a_unary(op_sub,%1); %}
- | NOT e5 %{ return a_unary(op_not,%1); %}
- | LPAR expr RPAR %{ return %1; %}
- ;
- datum : NUMBER %{ return v_ident (%0); %}
- | LETTER %{ return v_letter(%0); %}
- | IDENT %{ return v_letter(%0); %}
- ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement