Exemplo n.º 1
0
		public Grammar Parse(string filename)
		{
			this.scanner = new Scanner(filename);
			this.grammar = new Grammar();
			this.Advance();
			this.ParseHeader();
			this.ParseDeclarations();
			this.ParseProductions();
			this.ParseEpilog();
			return this.grammar;
		}
Exemplo n.º 2
0
 public Grammar Parse(string filename)
 {
     scanner = new Scanner(filename);
     grammar = new Grammar();
     baseName = System.IO.Path.GetFileNameWithoutExtension(filename);
     if (GPCG.DEFINES) grammar.TokFName = baseName + ".tokens";
     Advance();
     ParseHeader();
     ParseDeclarations();
     ParseProductions();
     ParseEpilog();
     return grammar;
 }
Exemplo n.º 3
0
		public void Generate(List<State> states, Grammar grammar)
		{
			this.grammar = grammar;
			this.GenerateCopyright();
			this.GenerateUsingHeader();
			this.output.WriteLine(grammar.headerCode);
			if (grammar.Namespace != null)
			{
				this.output.WriteLine("namespace {0}", grammar.Namespace);
				this.output.WriteLine("{");
			}
			this.GenerateTokens(grammar.terminals);
			this.GenerateClassHeader(grammar.ParserName);
			this.InsertCode(grammar.prologCode);
			this.GenerateInitializeMethod(grammar.ParserName, states, grammar.productions, grammar.nonTerminals);
			this.GenerateActionMethod(grammar.productions);
			this.GenerateToStringMethod();
			this.InsertCode(grammar.epilogCode);
			this.GenerateClassFooter();
			if (grammar.Namespace != null)
			{
				this.output.WriteLine("}");
			}
		}
Exemplo n.º 4
0
 public LR0Generator(Grammar grammar)
 {
     this.grammar = grammar;
 }
Exemplo n.º 5
0
        public void Generate(List<State> states, Grammar grammar)
        {
            StreamWriter tWrtr = null;
            StreamWriter sWrtr = null;
            StreamWriter cWrtr = null;
            TextWriter   save = Console.Out;

            this.grammar = grammar;
            if (grammar.OutFName != null)
            {
                try
                {
                    FileStream fStrm = new FileStream(grammar.OutFName, FileMode.Create);
                    sWrtr = new StreamWriter(fStrm);
                    Console.WriteLine("GPPG: sending output to {0}", grammar.OutFName);
                    Console.SetOut(sWrtr);
                }
                catch (IOException x)
                {
                    Console.Error.WriteLine("GPPG: Error. File redirect failed");
                    Console.Error.WriteLine(x.Message);
                    Console.Error.WriteLine("GPPG: Terminating ...");
                    Environment.Exit(1);
                }
            }

            if (grammar.TokFName != null) // generate token list file
            {
                try
                {
                    FileStream fStrm = new FileStream(grammar.TokFName, FileMode.Create);
                    tWrtr = new StreamWriter(fStrm);
                    tWrtr.WriteLine("// Symbolic tokens for parser for grammar file \"{0}\"", grammar.InputFName);
                }
                catch (IOException x)
                {
                    Console.Error.WriteLine("GPPG: Error. Failed to create token namelist file");
                    Console.Error.WriteLine(x.Message);
                    tWrtr = null;
                }
            }

            if (grammar.DiagFName != null) // generate conflict list file
            {
                try
                {
                    FileStream cStrm = new FileStream(grammar.DiagFName, FileMode.Create);
                    cWrtr = new StreamWriter(cStrm);
                    cWrtr.WriteLine("// Parser Conflict Information for grammar file \"{0}\"", grammar.InputFName);
                    cWrtr.WriteLine();
                }
                catch (IOException x)
                {
                    Console.Error.WriteLine("GPPG: Error. Failed to create conflict information file");
                    Console.Error.WriteLine(x.Message);
                    cWrtr = null;
                }
            }

            GenerateCopyright();

            GenerateUsingHeader();

            if (grammar.Namespace != null)
            {
                Console.WriteLine("namespace {0}", grammar.Namespace);
                Console.WriteLine('{');
            }

            GenerateTokens(grammar.terminals, tWrtr);
            grammar.ReportConflicts(cWrtr);

            GenerateClassHeader(grammar.ParserName);
            InsertCode(grammar.prologCode);
            GenerateInitializeMethod(states, grammar.productions, grammar.nonTerminals);
            GenerateActionMethod(grammar.productions);
            GenerateToStringMethod();
            InsertCode(grammar.epilogCode);
            GenerateClassFooter();

            if (grammar.Namespace != null)
                Console.WriteLine('}');

            if (tWrtr != null)
            {
                tWrtr.WriteLine("// End symbolic tokens for parser");
                tWrtr.Close(); // Close the optional token name stream
            }

            if (cWrtr != null)
            {
                cWrtr.WriteLine("// End conflict information for parser");
                cWrtr.Close(); // Close the optional token name stream
            }

            if (sWrtr != null)
            {
                Console.SetOut(save);
                sWrtr.Close();
            }
        }
Exemplo n.º 6
0
 public LALRGenerator(Grammar grammar)
     : base(grammar)
 {
 }
Exemplo n.º 7
0
        private void ParseRhs(NonTerminal lhs)
        {
            Production production = new Production(lhs);
            int        num        = 0;

            while (this.token == GrammarToken.Comment)
            {
                this.Advance();
            }
            while (this.token == GrammarToken.Symbol || this.token == GrammarToken.Literal || this.token == GrammarToken.Action || this.token == GrammarToken.Prec)
            {
                GrammarToken grammarToken = this.token;
                switch (grammarToken)
                {
                case GrammarToken.Symbol:
                    if (this.grammar.terminals.ContainsKey(this.scanner.yylval))
                    {
                        production.rhs.Add(this.grammar.terminals[this.scanner.yylval]);
                    }
                    else
                    {
                        production.rhs.Add(this.grammar.LookupNonTerminal(this.scanner.yylval));
                    }
                    this.Advance();
                    num++;
                    break;

                case GrammarToken.Literal:
                    production.rhs.Add(this.grammar.LookupTerminal(this.token, this.scanner.yylval));
                    this.Advance();
                    num++;
                    break;

                case GrammarToken.Action:
                {
                    SemanticAction semanticAction = new SemanticAction(production, this.tokenStartLine, num, this.scanner.yylval);
                    this.Advance();
                    if (this.token == GrammarToken.Divider || this.token == GrammarToken.SemiColon || this.token == GrammarToken.Prec)
                    {
                        production.semanticAction = semanticAction;
                    }
                    else
                    {
                        Grammar     arg_1BA_0   = this.grammar;
                        string      arg_1B5_0   = "@";
                        int         num2        = ++this.grammar.NumActions;
                        NonTerminal nonTerminal = arg_1BA_0.LookupNonTerminal(arg_1B5_0 + num2.ToString());
                        Production  production2 = new Production(nonTerminal);
                        production2.semanticAction = semanticAction;
                        this.grammar.AddProduction(production2);
                        production.rhs.Add(nonTerminal);
                    }
                    num++;
                    break;
                }

                default:
                    if (grammarToken == GrammarToken.Prec)
                    {
                        this.Advance();
                        if (this.token == GrammarToken.Symbol)
                        {
                            production.prec = this.grammar.LookupTerminal(this.token, this.scanner.yylval).prec;
                            this.Advance();
                        }
                        else
                        {
                            this.scanner.ReportError("Expected symbol after %prec", new object[0]);
                        }
                    }
                    break;
                }
                while (this.token == GrammarToken.Comment)
                {
                    this.Advance();
                }
            }
            this.grammar.AddProduction(production);
            Precedence.Calculate(production);
        }
Exemplo n.º 8
0
        private void ParseDeclarations()
        {
            int num = 0;

            while (this.token != GrammarToken.EndOfSection && this.token != GrammarToken.Eof)
            {
                switch (this.token)
                {
                case GrammarToken.Union:
                    this.grammar.unionType = this.scanner.yylval;
                    this.Advance();
                    continue;

                case GrammarToken.Type:
                {
                    this.Advance();
                    string kind = null;
                    if (this.token == GrammarToken.Kind)
                    {
                        kind = this.scanner.yylval;
                        this.Advance();
                    }
                    while (this.token == GrammarToken.Symbol)
                    {
                        NonTerminal nonTerminal = this.grammar.LookupNonTerminal(this.scanner.yylval);
                        nonTerminal.kind = kind;
                        this.Advance();
                    }
                    continue;
                }

                case GrammarToken.Token:
                {
                    this.Advance();
                    string kind2 = null;
                    if (this.token == GrammarToken.Kind)
                    {
                        kind2 = this.scanner.yylval;
                        this.Advance();
                    }
                    while (this.token == GrammarToken.Symbol)
                    {
                        string   name     = this.scanner.yylval;
                        Terminal terminal = this.grammar.LookupTerminal(this.token, name);
                        terminal.kind = kind2;
                        this.Advance();
                        if (this.token == GrammarToken.Number)
                        {
                            int value = 0;
                            if (!int.TryParse(this.scanner.yylval, out value))
                            {
                                this.scanner.ReportError("Incorrect token {0} value {1}", new object[]
                                    {
                                        this.token, this.scanner.yylval
                                    });
                            }
                            this.grammar.AssignTerminalValue(name, value);
                            this.Advance();
                        }
                        if (this.token == GrammarToken.Comment)
                        {
                            this.grammar.AssignTerminalComment(name, this.scanner.yylval.TrimStart('/'));
                            this.Advance();
                        }
                    }
                    continue;
                }

                case GrammarToken.Left:
                    this.Advance();
                    num += 10;
                    while (this.token == GrammarToken.Symbol || this.token == GrammarToken.Literal)
                    {
                        Terminal terminal2 = this.grammar.LookupTerminal(this.token, this.scanner.yylval);
                        terminal2.prec = new Precedence(PrecType.left, num);
                        this.Advance();
                    }
                    continue;

                case GrammarToken.Right:
                    this.Advance();
                    num += 10;
                    while (this.token == GrammarToken.Symbol || this.token == GrammarToken.Literal)
                    {
                        Terminal terminal3 = this.grammar.LookupTerminal(this.token, this.scanner.yylval);
                        terminal3.prec = new Precedence(PrecType.right, num);
                        this.Advance();
                    }
                    continue;

                case GrammarToken.NonAssoc:
                    this.Advance();
                    num += 10;
                    while (this.token == GrammarToken.Symbol || this.token == GrammarToken.Literal)
                    {
                        Terminal terminal4 = this.grammar.LookupTerminal(this.token, this.scanner.yylval);
                        terminal4.prec = new Precedence(PrecType.nonassoc, num);
                        this.Advance();
                    }
                    continue;

                case GrammarToken.Prolog:
                {
                    Grammar expr_7B = this.grammar;
                    expr_7B.prologCode += this.scanner.yylval;
                    this.Advance();
                    continue;
                }

                case GrammarToken.Start:
                    this.Advance();
                    if (this.token == GrammarToken.Symbol)
                    {
                        this.grammar.startSymbol = this.grammar.LookupNonTerminal(this.scanner.yylval);
                        this.Advance();
                        continue;
                    }
                    continue;

                case GrammarToken.Namespace:
                    this.Advance();
                    this.grammar.Namespace = this.scanner.yylval;
                    this.Advance();
                    while (this.scanner.yylval == ".")
                    {
                        this.Advance();
                        Grammar expr_2FF = this.grammar;
                        expr_2FF.Namespace = expr_2FF.Namespace + "." + this.scanner.yylval;
                        this.Advance();
                    }
                    continue;

                case GrammarToken.Visibility:
                    this.Advance();
                    this.grammar.Visibility = this.scanner.yylval;
                    this.Advance();
                    continue;

                case GrammarToken.Attributes:
                {
                    this.Advance();
                    StringBuilder stringBuilder = new StringBuilder(this.scanner.yylval);
                    while (this.Advance() == GrammarToken.Symbol)
                    {
                        stringBuilder.Append(' ');
                        stringBuilder.Append(this.scanner.yylval);
                    }
                    this.grammar.Attributes = stringBuilder.ToString();
                    continue;
                }

                case GrammarToken.ValueTypeAttributes:
                {
                    this.Advance();
                    StringBuilder stringBuilder = new StringBuilder(this.scanner.yylval);
                    while (this.Advance() == GrammarToken.Symbol)
                    {
                        stringBuilder.Append(' ');
                        stringBuilder.Append(this.scanner.yylval);
                    }
                    this.grammar.ValueTypeAttributes = stringBuilder.ToString();
                    continue;
                }

                case GrammarToken.ParserName:
                    this.Advance();
                    this.grammar.ParserName = this.scanner.yylval;
                    this.Advance();
                    continue;

                case GrammarToken.TokenName:
                    this.Advance();
                    this.grammar.TokenName = this.scanner.yylval;
                    this.Advance();
                    continue;

                case GrammarToken.ValueTypeName:
                    this.Advance();
                    this.grammar.ValueTypeName = this.scanner.yylval;
                    this.Advance();
                    continue;

                case GrammarToken.PositionType:
                    this.Advance();
                    this.grammar.PositionType = this.scanner.yylval;
                    this.Advance();
                    continue;

                case GrammarToken.Comment:
                    this.Advance();
                    continue;
                }
                this.scanner.ReportError("Unexpected token {0} in declaration section", new object[]
                {
                    this.token
                });
                this.Advance();
            }
            this.Advance();
        }
Exemplo n.º 9
0
        public void Generate(List <State> states, Grammar grammar)
        {
            StreamWriter tWrtr = null;
            StreamWriter sWrtr = null;
            TextWriter   save  = Console.Out;

            this.grammar = grammar;
            if (grammar.OutFName != null)
            {
                try
                {
                    FileStream fStrm = new FileStream(grammar.OutFName, FileMode.Create);
                    sWrtr = new StreamWriter(fStrm);
                    Console.WriteLine("GPPG: sending output to {0}", grammar.OutFName);
                    Console.SetOut(sWrtr);
                }
                catch (IOException x)
                {
                    Console.Error.WriteLine("GPPG: Error. File redirect failed");
                    Console.Error.WriteLine(x.Message);
                    Console.Error.WriteLine("GPPG: Terminating ...");
                    Environment.Exit(1);
                }
            }

            if (grammar.TokFName != null) // generate token list file
            {
                try
                {
                    FileStream fStrm = new FileStream(grammar.TokFName, FileMode.Create);
                    tWrtr = new StreamWriter(fStrm);
                    tWrtr.WriteLine("// Symbolic tokens for parser");
                }
                catch (IOException x)
                {
                    Console.Error.WriteLine("GPPG: Error. Failed to create token namelist file");
                    Console.Error.WriteLine(x.Message);
                    tWrtr = null;
                }
            }

            InsertCode(grammar.header);

            if (grammar.Namespace != null)
            {
                Console.WriteLine("namespace {0}", grammar.Namespace);
                Console.WriteLine("{");
            }

            GenerateTokens(grammar.terminals, tWrtr);

            GenerateClassHeader(grammar.ParserName);
            InsertCode(grammar.prologCode);
            GenerateInitializeMethod(states, grammar.productions);
            GenerateInitializeMetadata(grammar.productions, grammar.nonTerminals);
            GenerateActionMethod(grammar.productions);
            InsertCode(grammar.epilogCode);
            GenerateClassFooter();

            if (grammar.Namespace != null)
            {
                Console.WriteLine("}");
            }

            if (tWrtr != null)
            {
                tWrtr.WriteLine("// End symbolic tokens for parser");
                tWrtr.Close(); // Close the optional token name stream
            }

            if (sWrtr != null)
            {
                Console.SetOut(save);
                sWrtr.Close();
            }
        }