Esempio n. 1
0
 private static string GetFirstSymbol(Bamboo.Parsing.Grammars.Expression expression)
 {
     if (expression is Bamboo.Parsing.Grammars.Symbol)
     {
         Bamboo.Parsing.Grammars.Symbol symbol = (Bamboo.Parsing.Grammars.Symbol)expression;
         return(symbol.Token);
     }
     else if (expression is Bamboo.Parsing.Grammars.Concatenation)
     {
         Bamboo.Parsing.Grammars.Concatenation concatenation = (Bamboo.Parsing.Grammars.Concatenation)expression;
         return(GetFirstSymbol(concatenation.Expressions[0]));
     }
     else
     {
         throw new System.Exception("INVALID");
     }
 }
Esempio n. 2
0
        private static List <Bamboo.Parsing.Grammars.Expression> ToList(Bamboo.Parsing.Grammars.Expression expression)
        {
            List <Bamboo.Parsing.Grammars.Expression> list = new List <Bamboo.Parsing.Grammars.Expression>();

            if (expression is Bamboo.Parsing.Grammars.Symbol)
            {
                Bamboo.Parsing.Grammars.Symbol symbol = (Bamboo.Parsing.Grammars.Symbol)expression;
                list.Add(symbol);
            }
            else if (expression is Bamboo.Parsing.Grammars.Concatenation)
            {
                Bamboo.Parsing.Grammars.Concatenation concatenation = (Bamboo.Parsing.Grammars.Concatenation)expression;
                foreach (Bamboo.Parsing.Grammars.Symbol symbol in concatenation.Expressions)
                {
                    list.Add(symbol);
                }
            }
            else
            {
                throw new System.Exception("INVALID");
            }
            return(list);
        }
Esempio n. 3
0
 private static bool CanResolve(Bamboo.Parsing.Grammars.Expression expression, List <Bamboo.Parsing.Grammars.Production> remaining)
 {
     if (expression is Bamboo.Parsing.Grammars.Symbol)
     {
         Bamboo.Parsing.Grammars.Symbol symbol = (Bamboo.Parsing.Grammars.Symbol)expression;
         foreach (Bamboo.Parsing.Grammars.Production production in remaining)
         {
             if (production.Nonterminal.Equals(symbol.Token))
             {
                 return(false);
             }
         }
         return(true);
     }
     else if (expression is Bamboo.Parsing.Grammars.Concatenation)
     {
         Bamboo.Parsing.Grammars.Concatenation concatenation = (Bamboo.Parsing.Grammars.Concatenation)expression;
         return(CanResolve(concatenation.Expressions[0], remaining));
     }
     else
     {
         throw new System.Exception("INVALID");
     }
 }
Esempio n. 4
0
        public static void Generate(string name, string nspace, Bamboo.Parsing.Grammars.Grammar grammar, System.IO.TextWriter writer)
        {
            writer.WriteLine("//");
            writer.WriteLine("// AUTOGENERATED " + System.DateTime.Now + "");
            writer.WriteLine("//");
            writer.WriteLine("using System;");
            writer.WriteLine("");
            writer.WriteLine("namespace " + nspace + "");
            writer.WriteLine("{");
            writer.WriteLine("	public abstract class "+ name + "Evaluator");
            writer.WriteLine("	{");
            writer.WriteLine("");
            writer.WriteLine("		public "+ name + "Evaluator()");
            writer.WriteLine("		{");
            writer.WriteLine("		}");
            writer.WriteLine("");
            writer.WriteLine("		public object Evaluate("+ name + "Node node)");
            writer.WriteLine("		{");
            writer.WriteLine("			switch (node.Type)");
            writer.WriteLine("			{");
            foreach (string nonterminal in grammar.Nonterminals)
            {
                writer.WriteLine("				case "+ name + "NodeType." + nonterminal + ":");
                writer.WriteLine("					{");
                foreach (Bamboo.Parsing.Grammars.Production production in GetProductions(nonterminal, grammar))
                {
                    if (production.Expression is Bamboo.Parsing.Grammars.Concatenation)
                    {
                        Bamboo.Parsing.Grammars.Concatenation concatenation = (Bamboo.Parsing.Grammars.Concatenation)production.Expression;

                        string tag = "";

                        writer.Write("						if(");
                        writer.Write("node.Nodes.Count == " + concatenation.Expressions.Count);
                        int i = 0;
                        foreach (Bamboo.Parsing.Grammars.Symbol symbol in concatenation.Expressions)
                        {
                            tag += symbol.Token;
                            writer.Write(" && node.Nodes[" + i + "].Type == " + name + "NodeType." + symbol.Token + "");
                            i++;
                        }

                        writer.WriteLine(")");
                        writer.WriteLine("						{");
                        writer.WriteLine("							return Evaluate"+ tag + "(node);");
                        writer.WriteLine("						}");
                    }
                    else if (production.Expression is Bamboo.Parsing.Grammars.Symbol)
                    {
                        Bamboo.Parsing.Grammars.Symbol symbol = (Bamboo.Parsing.Grammars.Symbol)production.Expression;

                        if (!symbol.Token.Equals("EPSILON"))
                        {
                            string tag = symbol.Token;

                            writer.Write("						if(");
                            writer.Write("node.Nodes.Count == 1");
                            writer.Write(" && node.Nodes[0].Type == " + name + "NodeType." + symbol.Token + "");
                            writer.WriteLine(")");
                            writer.WriteLine("						{");
                            if (grammar.Terminals.Contains(symbol.Token))
                            {
                                writer.WriteLine("							return Evaluate"+ tag + "(node.Nodes[0].Value);");
                            }
                            else
                            {
                                writer.WriteLine("							return Evaluate"+ tag + "(node.Nodes[0]);");
                            }
                            writer.WriteLine("						}");
                        }
                    }
                    else
                    {
                        throw new System.Exception("Invalid expression.");
                    }
                }
                writer.WriteLine("						throw new System.Exception(\"Invalid expression.\");");
                writer.WriteLine("					}");
            }
            foreach (string terminal in grammar.Terminals)
            {
                if (!terminal.Equals("EPSILON"))
                {
                    writer.WriteLine("				case "+ name + "NodeType." + terminal + ":");
                    writer.WriteLine("					{");
                    writer.WriteLine("						return Evaluate"+ terminal + "(node.Value);");
                    writer.WriteLine("					}");
                }
            }
            writer.WriteLine("				default:");
            writer.WriteLine("					{");
            writer.WriteLine("						throw new System.Exception(\"Invalid expression.\");");
            writer.WriteLine("					}");
            writer.WriteLine("			}");
            writer.WriteLine("		}");
            writer.WriteLine("");
            Surf.Set functions = new Surf.Set();
            functions.Define("EPSILON", "EPSILON");
            foreach (string nonterminal in grammar.Nonterminals)
            {
                foreach (Bamboo.Parsing.Grammars.Production production in GetProductions(nonterminal, grammar))
                {
                    string tag = "";

                    if (production.Expression is Bamboo.Parsing.Grammars.Concatenation)
                    {
                        Bamboo.Parsing.Grammars.Concatenation concatenation = (Bamboo.Parsing.Grammars.Concatenation)production.Expression;

                        foreach (Bamboo.Parsing.Grammars.Symbol symbol in concatenation.Expressions)
                        {
                            tag += symbol.Token;
                        }
                        if (!functions.IsDefined(tag))
                        {
                            writer.WriteLine("		protected virtual object Evaluate"+ tag + "(" + name + "Node node)");
                            writer.WriteLine("		{");
                            writer.WriteLine("			throw new System.Exception(\"Implement.\");");
                            writer.WriteLine("		}");
                            writer.WriteLine("");
                            functions.Define(tag, tag);
                        }
                    }
                    else if (production.Expression is Bamboo.Parsing.Grammars.Symbol)
                    {
                        Bamboo.Parsing.Grammars.Symbol symbol = (Bamboo.Parsing.Grammars.Symbol)production.Expression;

                        tag += symbol.Token;
                        if (!functions.IsDefined(tag))
                        {
                            if (grammar.Terminals.Contains(symbol.Token))
                            {
                                writer.WriteLine("		protected virtual object Evaluate"+ tag + "(string value)");
                            }
                            else
                            {
                                writer.WriteLine("		protected virtual object Evaluate"+ tag + "(" + name + "Node node)");
                            }
                            writer.WriteLine("		{");
                            writer.WriteLine("			throw new System.Exception(\"Implement.\");");
                            writer.WriteLine("		}");
                            writer.WriteLine("");
                            functions.Define(tag, tag);
                        }
                    }
                    else
                    {
                        throw new System.Exception("Invalid expression.");
                    }
                }
            }
            foreach (string terminal in grammar.Terminals)
            {
                if (!functions.IsDefined(terminal))
                {
                    writer.WriteLine("		protected virtual object Evaluate"+ terminal + "(string value)");
                    writer.WriteLine("		{");
                    writer.WriteLine("			throw new System.Exception(\"Implement.\");");
                    writer.WriteLine("		}");
                    writer.WriteLine("");
                    functions.Define(terminal, terminal);
                }
            }
            writer.WriteLine("	}");
            writer.WriteLine("}");
        }