Inheritance: PascalParserTD
        // Parse a compound statement.
        public override ICodeNode Parse(Token token)
        {
            token = NextToken();

            // Create the compound node.
            ICodeNode compoundNode = ICodeFactory.CreateICodeNode(ICodeNodeTypeImplementation.COMPOUND);

            // Parse the statement list terminated by the END token.
            StatementParser statementParser = new StatementParser(this);
            statementParser.ParseList(token, compoundNode, PascalTokenType.END, PascalErrorCode.MISSING_END);

            return compoundNode;
        }
        // Parse a compound statement.
        public override ICodeNode Parse(Token token)
        {
            token = NextToken();

            // Create the compound node.
            ICodeNode compoundNode = ICodeFactory.CreateICodeNode(ICodeNodeTypeImplementation.COMPOUND);

            // Parse the statement list terminated by the END token.
            StatementParser statementParser = new StatementParser(this);

            statementParser.ParseList(token, compoundNode, PascalTokenType.END, PascalErrorCode.MISSING_END);

            return(compoundNode);
        }
        // Parse a Pascal source program and generate the symbol table and the intermediate code.
        public override void parse()
        {
            long startTime = DateTime.Now.Ticks;
            iCode = ICodeFactory.CreateICode();

            try
            {
                Token token = NextToken();
                ICodeNode rootNode = null;

                // Look for the BEGIN token to parse a compound statement.
                if (token.type == PascalTokenType.BEGIN)
                {
                    StatementParser statementParser = new StatementParser(this);
                    rootNode = statementParser.Parse(token);
                    token = CurrentToken();
                }
                else
                    errorHandler.flag(token, PascalErrorCode.UNEXPECTED_TOKEN, this);

                // Look for the final period.
                if (token.type != PascalTokenType.DOT)
                    errorHandler.flag(token, PascalErrorCode.MISSING_PERIOD, this);

                token = CurrentToken();

                // Set parse tree root node.
                if (rootNode != null)
                    iCode.SetRoot(rootNode);

                // Send parser summary message.
                float elapsedTime = (DateTime.Now.Ticks - startTime) / 10000000f;
                sendMessage(new Message(MessageType.PARSER_SUMMARY,
                                        new IConvertible[] { token.lineNumber, getErrorCount(), elapsedTime }));
            }
            catch (System.IO.IOException e)
            {
                errorHandler.abortTranslation(PascalErrorCode.IO_ERROR, this);
            }
        }