// Returns NProgram public Node Program() { NProgram nProgram = new NProgram(); NVarDefList nVarDefList = new NVarDefList(); NFunDefList nFunDefList = new NFunDefList(); while (firstOfProgram.Contains(CurrentToken)) { if (CurrentToken == TokenCategory.VAR) { VarDef(nVarDefList); } else if (CurrentToken == TokenCategory.IDENTIFIER) { FunDef(nFunDefList); } else if (CurrentToken == TokenCategory.EOF) { break; } else { throw new SyntaxError(firstOfProgram, tokenStream.Current); } } if (!firstOfProgram.Contains(CurrentToken)) { throw new SyntaxError(new HashSet <TokenCategory>() { TokenCategory.IDENTIFIER, TokenCategory.VAR, TokenCategory.EOF } , tokenStream.Current); } nProgram.Add(nVarDefList); nProgram.Add(nFunDefList); return(nProgram); }