public void Simple() { var grammarString = @" <ws> ::= <WhiteSpace> <ws> | <simple-value> ::= <simple-value> <LetterOrDigit> | <simple-value> <bracket-value> ::= <bracket-value> <simple-value> | <bracket-value> <optional-bracket> ::= '(' <bracket-value> ')' | <simple-value> <first> ::= <optional-bracket> <second> ::= <optional-bracket> <grammar> ::= <ws> <first> <second> <ws> " ; var input = " hello ( parsing world ) "; // our grammar var grammar = new BnfGrammar().Build(grammarString, "grammar"); var match = grammar.Match(input); Assert.IsTrue(match.Success); Assert.AreEqual("hello", match["first"]["simple-value", true].Text); Assert.AreEqual("parsing world", match["second"]["bracket-value", true].Text); }
BnfGrammar Convert(EbnfGrammar EG) { Bnf = new BnfGrammar(); Footprint = new OperationFootprintGroup <EbnfGrammar, BnfGrammar> (EG, Bnf); foreach (var er in EG.Rules) { BnfRule br = Convert(er); } Footprint.Parts = ops.ToArray(); return(Bnf); }
public bool Parse() { var grammar = new BnfGrammar(); var parseEngine = new ParseEngine(grammar); var parseRunner = new ParseRunner(parseEngine, sampleBnf); while (!parseRunner.EndOfStream() && parseRunner.Read()) { } return(parseRunner.ParseEngine.IsAccepted()); }
public void BnfToCode() { // roundtrip to generated code then back again var bnfParser = new BnfGrammar(); // generate code from bnf var code = bnfParser.ToCode(postalAddressBnf, "postal-address", "PostalGrammar"); // execute the code and test var addressParser = Helper.Create <Grammar>(code, "PostalGrammar"); TestAddress(addressParser); }
public void BnfShouldProduceParseChartForTextGrammar() { var grammar = new BnfGrammar(); var parseEngine = new ParseEngine(grammar); var parseRunner = new ParseRunner(parseEngine, _bnfText); while (!parseRunner.EndOfStream()) { if (!parseRunner.Read()) { var position = parseRunner.Position; var startIndex = 0; for (int i = position; i >= 0; i--) { if (_bnfText[i] == '\n' && i > 0) { if (_bnfText[i - 1] == '\r') { startIndex = i; break; } } } var endIndex = _bnfText.IndexOf( System.Environment.NewLine, position, System.StringComparison.CurrentCulture); endIndex = endIndex < 0 ? _bnfText.Length : endIndex; var length = endIndex - startIndex; var stringBuilder = new StringBuilder(); stringBuilder .Append($"Error parsing input string at position {parseRunner.Position}.") .AppendLine() .Append($"start: {startIndex}") .AppendLine() .AppendLine(_bnfText.Substring(startIndex, length)); Assert.Fail(stringBuilder.ToString()); } } Assert.IsTrue( parseRunner.ParseEngine.IsAccepted(), $"error at position {parseRunner.Position}"); }
public void BnfShouldParseLargeGrammarInFile() { var bnf = File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "Bnf", "AnsiC.bnf")); Assert.IsFalse(string.IsNullOrEmpty(bnf)); var grammar = new BnfGrammar(); var parseEngine = new ParseEngine(grammar); var parseRunner = new ParseRunner(parseEngine, bnf); while (!parseRunner.EndOfStream()) { if (!parseRunner.Read()) { Assert.Fail($"Error Parsing At Position {parseRunner.Position}"); } } Assert.IsTrue(parseEngine.IsAccepted()); }
private static string GetCode(CommandLineOptions opts) { switch (Path.GetExtension(opts.GrammarFile)) { case ".bnf": var gr = new BnfGrammar(); return(gr.ToCode(File.ReadAllText(opts.GrammarFile), opts.StartParser, opts.GrammarName)); case ".ebnf": var egr = new EbnfGrammar(EbnfStyle.W3c | EbnfStyle.SquareBracketAsOptional | EbnfStyle.WhitespaceSeparator); return(egr.ToCode(File.ReadAllText(opts.GrammarFile), opts.StartParser, opts.GrammarName)); case ".gold": var ggr = new GoldGrammar(); return(ggr.ToCode(File.ReadAllText(opts.GrammarFile), opts.GrammarName)); } throw new Exception("Unknown Grammar. Try .ebnf .bnf .gold"); }
public ElkhoundGlrParser( object context, BnfGrammar grammar, TransitionDelegate transition, GrammarActionDelegate grammarAction, int[] stateToPriorToken, int[] conflictActionsTable, Func <object, int, IReciever <Msg>, IReciever <Msg> > makeSwitch) { this.context = context; this.grammar = grammar; this.grammarAction = grammarAction; this.transition = transition; this.stateToPriorToken = stateToPriorToken; this.conflictActionsTable = conflictActionsTable; this.gss = new Gss(); gss.AddTopmost(0); }
public void BnfParsingSpeed() { var bnfParser = new BnfGrammar(); Helper.TestSpeed(bnfParser, postalAddressBnf, speedIterations); }
public static Grammar GetAddressParser() { var bnfParser = new BnfGrammar(); return(bnfParser.Build(postalAddressBnf, "postal-address")); }