/// <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); }
/// <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; } }