//<if> -> IF ( <expr> <RO> <expr>) THEN <block> node_t* if_f() { node_t *p = getNode("<if>"); if (tk.name == "(") { // ( //don't need to put delimiters in the tree tk = scanner(fp, lineNum); p->child1 = expr_f(); p->child2 = RO_f(); p->child3 = expr_f(); if (tk.name == ")") { // ) //don't need to put delimiters in the tree tk = scanner(fp, lineNum); if (tk.tokenId == THEN_tk) { tk = scanner(fp, lineNum); p->child4 = block_f(); return p; } else { error("Got token " + tk.name = ", expected THEN token\n'"); } } else { error("Got token " + tk.name = ", expected ) token\n"); } } else { error("Got token " + tk.name = ", expected ( token\n"); } return p; }
void partial_block_f() { if (state!=partial_block) { delete WGr_pointer; WGr_pointer=NULL; delete block_pointer; // destroy installed block first block_pointer = new non_integral_block(currentRepContext(), currentStandardRepr()); state=partial_block; entry_z = current_param_block().size()-1; } block_f(); } // |partial_block_f|
void nblock_f() { if (state!=nblock) { delete WGr_pointer; WGr_pointer=NULL; delete block_pointer; // destroy installed block first block_pointer = new non_integral_block(currentRepContext(), currentStandardRepr(), entry_z); state=nblock; } block_f(); } // |nblock_f|
//<program> -> PROGRAM <var> <block> node_t* prog_f() { node_t *p = getNode("<program>"); if(tk.tokenId == PROG_tk) { // PROGRAM p->child1 = getNode("PROGRAM"); tk = scanner(fp, lineNum); p->child2 = var_f(); p->child3 = block_f(); return p; } else { error("Got token " + tk.name + ", expected PROGRAM token\n"); } return p; }
//<stat> -> <in> | <out> | <block> | <if> | <loop> | <assign> node_t* stat_f() { node_t *p = getNode("<stat>"); if (tk.tokenId == SCAN_tk) { // <in> p->child1 = getNode("SCAN"); tk = scanner(fp, lineNum); p->child2 = in_f(); return p; } else if (tk.tokenId == PRINT_tk) { // <out> p->child1 = getNode("PRINT"); tk = scanner(fp, lineNum); p->child2 = out_f(); return p; } else if (tk.name == "{") { // <block> //don't need to put delimiters in the tree p->child1 = block_f(); return p; } else if (tk.tokenId == IF_tk) { // <if> p->child1 = getNode("IF"); tk = scanner(fp, lineNum); p->child2 = if_f(); return p; } else if (tk.tokenId == LOOP_tk) { // <loop> p->child1 = getNode("LOOP"); tk = scanner(fp, lineNum); p->child2 = loop_f(); return p; } else if (tk.tokenId == IDENT_tk) { // <assign> p->child1 = assign_f(); return p; } else { error("Got token " + tk.name + ", expected SCAN, PRINT, {, IF, LOOP, or IDENTIFIER token\n"); } return p; }