Exemple #1
0
        /// <summary>
        /// program-heading :: "program" identifier [ '(' program-parameter-list ')' ] .
        /// program-block :: block .
        /// </summary>
        /// <returns>A compiled program.</returns>
        private ICompiledProgramPart ParseProgramHeading()
        {
            // "PROGRAM".
            ExpectAndEat(TokenCode.TOK_KEY_PROGRAM, "The 'PROGRAM' key word expected.");

            // An identifier.
            Expect(TokenCode.TOK_IDENT, "A program name expected.");

            var program = new CompiledProgramParts.Program(Tokenizer.CurrentToken.StringValue);

            // program-parameter-list?
            var t = Tokenizer.NextToken();

            if (t.TokenCode == TokenCode.TOK_LBRA)
            {
                // Eat '('.
                Tokenizer.NextToken();

                ParseProgramParameterList(program);

                // ')'.
                ExpectAndEat(TokenCode.TOK_RBRA, "The end of program parameter list ')' expected.");
            }

            return(program);
        }
Exemple #2
0
        /// <summary>
        /// program-parameter-list :: identifier-list .
        /// identifier-list :: identifier { ',' identifier } .
        /// </summary>
        private void ParseProgramParameterList(CompiledProgramParts.Program program)
        {
            Expect(TokenCode.TOK_IDENT, "An external file descriptor identifier expected.");

            var t = Tokenizer.CurrentToken;

            while (t.TokenCode != TokenCode.TOK_EOF)
            {
                Expect(TokenCode.TOK_IDENT, "An external file descriptor identifier expected.");

                program.AddExternalFileDescriptor(t.StringValue);

                // Eat identifier.
                t = Tokenizer.NextToken();
                if (t.TokenCode == TokenCode.TOK_LIST_SEP)
                {
                    // Eat ','.
                    t = Tokenizer.NextToken();

                    continue;
                }

                break;
            }
        }