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"); } }
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); }
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"); } }
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("}"); }