double declaration(bool is_const) //Handle 'name = expression' //Declare a variable called "name" with initial value "expresion" { Token t = ts.get(); if (t.kind != name) error("name expected in declaration"); string var_name = t.name; Token t2 = ts.get(); if (t2.kind != '=') error("= missing in declaration of ",var_name); double d = expression(); switch (is_const) { case true: symtable.declare(var_name, d, true); break; default: if (symtable.is_declared(var_name)) symtable.set(var_name, d); else symtable.declare(var_name, d, false); } return d; }
double primary() { Token t = ts.get(); switch (t.kind) { case '(': { double d = expression(); t = ts.get(); if (t.kind != ')') error("expected ')'"); return d; } case '{': { double d = expression(); t = ts.get(); if (t.kind != '}') error("expected '}'"); return d; } case number: return t.value; case '-': return - primary(); case '+': return primary(); case name: { Token next = ts.get(); if (next.kind == '=') { double d = expression(); sym_table.set(t.name,d); return d; } else { ts.putback(next); return sym_table.get(t.name); } } default: error("primary expected"); } }