Procedure class. A procedure can take 0-1 value arguments and; 0-1 result argument that must be the last one.
Inheritance: Node
 public virtual void Visit(Procedure node)
 {
 }
 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();
 }