Development
Grammar (LL1)
Terminal Symbols
- function
- return
- if
- else
- while
- for
- break
- continue
- var
- func_name
- {
- }
- (
- )
- ,
- ;
- !
- =
- +=
- -=
- *=
- /=
- %=
- ||
- &&
- <
- >
- <=
- >=
- ==
- !=
- +
- -
- *
- /
- %
- bool_val
- int_val
- float_val
- string_val
- ++
- --
Nonterminal Symbols
- S
- Params
- Params_c
- Block
- Cmd
- Cmd_c
- Ee
- E
- E_c
- A
- A_c
- B
- B_c
- C
- C_c
- D
- D_c
- F
- F_c
- G
- G_c
- L
- L_c
Start Symbol
- S
Rules
- S ->
- S -> function func_name ( Params ) { Block } S
- S -> Cmd S
- Params -> var Params_c
- Params ->
- Params_c -> , var Params_c
- Params_c ->
- Cmd -> { Block }
- Cmd -> ;
- Cmd -> E ;
- Cmd -> return Ee ;
- Cmd -> break ;
- Cmd -> continue ;
- Cmd -> while ( E ) Cmd
- Cmd -> for ( Ee ; Ee ; Ee ) Cmd
- Cmd -> if ( E ) Cmd Cmd_c
- Cmd_c -> else Cmd
- Cmd_c ->
- Block -> Cmd Block
- Block ->
- Ee -> E
- Ee ->
- E -> A E_c
- E -> - A E_c
- E -> ! A E_c
- E_c -> = A E_c
- E_c -> += A E_c
- E_c -> -= A E_c
- E_c -> *= A E_c
- E_c -> /= A E_c
- E_c -> %= A E_c
- E_c ->
- A -> B A_c
- A_c -> || B A_c
- A_c ->
- B -> C B_c
- B_c -> && C B_c
- B_c ->
- C -> D C_c
- C_c -> < D C_c
- C_c -> > D C_c
- C_c -> <= D C_c
- C_c -> >= D C_c
- C_c -> == D C_c
- C_c -> != D C_c
- C_c ->
- D -> F D_c
- D_c -> + F D_c
- D_c -> - F D_c
- D_c ->
- F -> G F_c
- F_c -> * G F_c
- F_c -> / G F_c
- F_c -> % G F_c
- F_c ->
- G -> bool_val
- G -> int_val
- G -> float_val
- G -> string_val
- G -> ( E )
- G -> ++ var
- G -> -- var
- G -> var G_c
- G -> func_name ( L )
- G_c -> ++
- G_c -> --
- G_c ->
- L -> E L_c
- L ->
- L_c -> , E L_c
- L_c ->
Parsing Table
Parsing table for LL1 grammar was generated by the script parsingtbl.php (unknown license, local copy), which was written by L. Vagner. The output of the script is here.
Semantics
Semantics table
Nonterminal | Inheritable | Synthesized |
---|---|---|
S | ||
Params | rettree | |
Params_c | rettree | |
Cmd | rettree | |
Cmd_c | rettree | |
Block | rettree | |
Ee | rettree | |
E | rettree | |
E_c | optree | rettree |
A | rettree | |
A_c | optree | rettree |
B | rettree | |
B_c | optree | rettree |
C | rettree | |
C_c | optree | rettree |
D | rettree | |
D_c | optree | rettree |
F | rettree | |
F_c | optree | rettree |
G | rettree | |
G_c | optree | rettree |
L | rettree | |
L_c | rettree |
Semantic rules
- nothing;
- global_block.push_back(Cmd.rettree);
- context.AddFunction(new function(name, Params.rettree, Block.rettree));
- Params.rettree = Params_c.rettree; Params.rettree.push_front(var.name);
- Params.rettree = NULL;
- Params_c_0.rettree = Params_c_1.rettree; Params_c_0.rettree.push_front(var.name);
- Params_c.rettree = NULL;
- Cmd.rettree = Block.rettree;
- Cmd.rettree = NULL;
- Cmd.rettree = E.rettree;
- Cmd.rettree = Ee.rettree;
- Cmd.rettree = new break;
- Cmd.rettree = new continue;
- Cmd.rettree = new loop(NULL, E.rettree, NULL, Cmd.rettree);
- Cmd.rettree = new loop(Ee_0.rettree, Ee_1.rettree, Ee_2.rettree, Cmd.rettree);
- Cmd.rettree = new ifelse(E.rettree, Cmd.rettree, Cmd_c.rettree);
- Cmd_c.rettree = Cmd.rettree;
- Cmd_c.rettree = NULL;
- Block_0.rettree = Block_1_rettree; Block_0.rettree.push_front(Cmd.rettree);
- Block.rettree = NULL;
- Ee.rettree = E.rettree;
- Ee.rettree = NULL;
- E_c.optree = A.rettree; E.rettree = E_c.rettree;
- E_c.optree = A.rettree; E.rettree = new op_minus(E_c.rettree);
- E_c.optree = A.rettree; E.rettree = new op_not(E_c.rettree);
- E_c_1.optree = A.rettree; E_c_0.rettree = E_c_1.rettree;
- E_c_1.optree = A.rettree; E_c_0.rettree = new op_plus_as(E_c_1.rettree);
- by analogy
- by analogy
- by analogy
- by analogy
- E_c.rettree = E_c.optree;
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- by analogy
- G.rettree = new bool_value(bool_val.value);
- by analogy
- by analogy
- by analogy
- G.rettree = E.rettree;
- G.rettree = new pre_inc(var.name);
- by analogy
- G_c.optree = new variable(var.name); G.rettree = G_c.retree;
- G_c.optree = new function_call(func_name.name, L.rettree);
- G_c.rettree = new post_inc(var.name)
- by analogy
- G_c.rettree = G_c.optree;
- L.rettree = L_c.rettree; L.rettree.push_front(E.rettree);
- L.rettree = NULL;
- L_c_0.rettree = L_c_1.rettree; L_c_0.rettree.push_front(E.rettree);
- L_c.rettree = NULL;