void Proc(ProcedureSequence procs)
{
StatementSequence statements;
string name;
VariableSequence valArgs = new VariableSequence();
Variable resultArg = null;
Expect(5);
Token ptok = t;
Expect(1);
name = t.val;
Expect(6);
if (la.kind == 7 || la.kind == 8) {
if (la.kind == 7) {
Get();
Expect(1);
Variable v = new Variable(t.val);
v.IsValueArg = true;
valArgs.AddVariable(v);
SymbolTable.DefineArgument(t.val);
if (la.kind == 12) {
Args(valArgs, out resultArg);
}
} else {
Get();
Expect(1);
resultArg = new Variable(t.val);
resultArg.IsResultArg = true;
SymbolTable.DefineResultArgument(t.val);
}
}
Expect(9);
SequencePoint seq1 = new SequencePoint(ptok.line,ptok.col, t.line,t.col+t.val.Length);
Expect(10);
StmtSeq(out statements);
Expect(4);
SequencePoint seq2 = new SequencePoint(t.line, t.col, t.line, t.col+t.val.Length);
Expect(11);
if (procs.ContainsProcedure(name)) {
errors.SemErr(ptok.line, ptok.col, "Procedure '" + name + "' is already declared");
} else {
Procedure proc = new Procedure(name, valArgs, resultArg, statements);
proc.AddSequencePoint(seq1);
proc.AddSequencePoint(seq2);
procs.AddProcedure(proc);
}
SymbolTable.Clear();
}