private PascalProgram ParseProgram()
        {
            var    c    = Current;
            string name = "";

            if (c.SubType == Tokenizer.TokenSubType.Program)
            {
                Next();
                var n = Current;
                Require(Identifier);
                name = n.Value.ToString();
                Require(Semicolon);
            }
            SymTable st = new SymTable
            {
                { TypeSymbol.IntTypeSymbol.Name, TypeSymbol.IntTypeSymbol },
                { TypeSymbol.RealTypeSymbol.Name, TypeSymbol.RealTypeSymbol },
                { TypeSymbol.CharTypeSymbol.Name, TypeSymbol.CharTypeSymbol }
            };

            if (st.LookUp(name) != null)
            {
                throw new ParserException("Illegal program name", c.Line, c.Position);
            }
            ProgramSymbol pn;

            if (name != "")
            {
                pn = new ProgramSymbol {
                    Name = name
                };
                st.Add(name, pn);
            }
            else
            {
                pn = new ProgramSymbol {
                    Name = ""
                };
            }
            var b = ParseBlock(st);

            Require(Dot);
            return(new PascalProgram {
                Block = b, Name = pn
            });
        }
Esempio n. 2
0
        public static Symbol ParserFormula(List <DecafToken> tokens)
        {
            var symbols = tokens.Select(x => new TerminalSymbol(x));

            if (symbols.Any())
            {
                Console.WriteLine("Terminal Symbols");
                Console.WriteLine("================");

                foreach (var terminal in symbols)
                {
                    Console.WriteLine("{0} ({1})", terminal.TokenType, terminal.LineInfo);
                }

                Console.WriteLine();
            }

            ProgramSymbol programSymbol = new ProgramSymbol(symbols);

            return(programSymbol);
        }