public BnfGrammar(Mode mode) { var alternationChar = (mode == Mode.Strict) ? "/" : "|"; var rulename = new IdentifierTerminal("rulename", "-_", null); var funcname = new IdentifierTerminal("funcname", ".", null); var newrulename = new IdentifierTerminal("newrulename", "-_", null); //var comment1 = new CommentTerminal("comment", "/*", "*/"); var comment = new CommentTerminal("comment", ";", "\n"); var bindig1 = new NumberLiteral("bindig", NumberOptions.Binary | NumberOptions.IntOnly); var bindig2 = new NumberLiteral("bindig", NumberOptions.Binary | NumberOptions.IntOnly); var hexdig1 = new NumberLiteral("hexdig", NumberOptions.Hex | NumberOptions.IntOnly); var hexdig2 = new NumberLiteralEx("hexdig", NumberOptions.Hex | NumberOptions.IntOnly); var decdig1 = new NumberLiteral("decvalue", NumberOptions.IntOnly); var decdig2 = new NumberLiteral("decvalue", NumberOptions.IntOnly); var charval = new StringLiteral("charval", "\"", StringOptions.NoEscapes); var repeat1 = new NumberLiteral("repeat1", NumberOptions.IntOnly | NumberOptions.AllowLetterAfter); var repeat2 = new NumberLiteral("repeat2", NumberOptions.IntOnly | NumberOptions.AllowLetterAfter); var minus = ToTerm("-", "minus"); var point = ToTerm(".", "point"); bindig1.AddPrefix("b", NumberOptions.None); hexdig1.AddPrefix("x", NumberOptions.None); decdig1.AddPrefix("d", NumberOptions.None); //base.NonGrammarTerminals.Add(comment1); base.NonGrammarTerminals.Add(comment); // NON TERMINALS var numval = new NonTerminal("numval"); var hexval = new NonTerminal("hexval"); var hexvalp = new NonTerminal("hexvalpoint"); var hexvalps = new NonTerminal("hexvalpointstar"); var binval = new NonTerminal("binval"); var binvalp = new NonTerminal("binvalpoint"); var binvalps = new NonTerminal("binvalpointstar"); var decval = new NonTerminal("decval"); var decvalp = new NonTerminal("decvalpoint"); var decvalps = new NonTerminal("decvalpointstar"); var rule = new NonTerminal("rule"); var rulelist = new NonTerminal("rulelist"); var alternation = new NonTerminal("alternation"); var concatenation = new NonTerminal("concatenation"); var subtraction = new NonTerminal("subtraction"); var repetition = new NonTerminal("repetition"); var repeat = new NonTerminal("repeat"); var element = new NonTerminal("element"); var elements = new NonTerminal("elements"); var group = new NonTerminal("group"); var option = new NonTerminal("option"); var func = new NonTerminal("func"); var funcarg = new NonTerminal("funcarg"); var funcargs = new NonTerminal("funcargs"); // RULES hexval.Rule = hexdig1 + (hexvalps | (minus + hexdig2) | Empty); hexvalp.Rule = point + hexdig2; hexvalps.Rule = MakePlusRule(hexvalps, hexvalp); binval.Rule = bindig1 + (binvalps | (minus + bindig2) | Empty); binvalp.Rule = point + bindig2; binvalps.Rule = MakePlusRule(binvalps, binvalp); decval.Rule = decdig1 + (decvalps | (minus + decdig2) | Empty); decvalp.Rule = point + decdig2; decvalps.Rule = MakePlusRule(decvalps, decvalp); numval.Rule = ToTerm("%") + (binval | hexval | decval); BnfExpression rp = ToTerm("*"); if (mode == Mode.HttpCompatible) rp = rp | "#"; repeat.Rule = ((repeat1) | ((repeat1 | Empty) + rp + (repeat2 | Empty))); group.Rule = ToTerm("(") + alternation + ")"; option.Rule = ToTerm("[") + alternation + "]"; funcarg.Rule = alternation; funcargs.Rule = MakePlusRule(funcargs, ToTerm(","), funcarg); func.Rule = ToTerm("{") + funcname + "," + funcargs + "}"; alternation.Rule = MakePlusRule(alternation, ToTerm(alternationChar), subtraction); subtraction.Rule = MakePlusRule(subtraction, ToTerm("&!"), concatenation); concatenation.Rule = MakePlusRule(concatenation, repetition); repetition.Rule = (Empty | repeat) + element; element.Rule = rulename | group | option | numval | charval | func; elements.Rule = alternation; rule.Rule = NewLineStar + newrulename + (ToTerm("=") | ToTerm("=" + alternationChar)) + elements + NewLinePlus; rulelist.Rule = MakeStarRule(rulelist, rule); base.Root = rulelist; }
public BnfGrammar(Mode mode) { var alternationChar = (mode == Mode.Strict) ? "/" : "|"; var rulename = new IdentifierTerminal("rulename", "-_", null); var funcname = new IdentifierTerminal("funcname", ".", null); var newrulename = new IdentifierTerminal("newrulename", "-_", null); //var comment1 = new CommentTerminal("comment", "/*", "*/"); var comment = new CommentTerminal("comment", ";", "\n"); var bindig1 = new NumberLiteral("bindig", NumberOptions.Binary | NumberOptions.IntOnly); var bindig2 = new NumberLiteral("bindig", NumberOptions.Binary | NumberOptions.IntOnly); var hexdig1 = new NumberLiteral("hexdig", NumberOptions.Hex | NumberOptions.IntOnly); var hexdig2 = new NumberLiteralEx("hexdig", NumberOptions.Hex | NumberOptions.IntOnly); var decdig1 = new NumberLiteral("decvalue", NumberOptions.IntOnly); var decdig2 = new NumberLiteral("decvalue", NumberOptions.IntOnly); var charval = new StringLiteral("charval", "\"", StringOptions.NoEscapes); var repeat1 = new NumberLiteral("repeat1", NumberOptions.IntOnly | NumberOptions.AllowLetterAfter); var repeat2 = new NumberLiteral("repeat2", NumberOptions.IntOnly | NumberOptions.AllowLetterAfter); var minus = ToTerm("-", "minus"); var point = ToTerm(".", "point"); bindig1.AddPrefix("b", NumberOptions.None); hexdig1.AddPrefix("x", NumberOptions.None); decdig1.AddPrefix("d", NumberOptions.None); //base.NonGrammarTerminals.Add(comment1); base.NonGrammarTerminals.Add(comment); // NON TERMINALS var numval = new NonTerminal("numval"); var hexval = new NonTerminal("hexval"); var hexvalp = new NonTerminal("hexvalpoint"); var hexvalps = new NonTerminal("hexvalpointstar"); var binval = new NonTerminal("binval"); var binvalp = new NonTerminal("binvalpoint"); var binvalps = new NonTerminal("binvalpointstar"); var decval = new NonTerminal("decval"); var decvalp = new NonTerminal("decvalpoint"); var decvalps = new NonTerminal("decvalpointstar"); var rule = new NonTerminal("rule"); var rulelist = new NonTerminal("rulelist"); var alternation = new NonTerminal("alternation"); var concatenation = new NonTerminal("concatenation"); var subtraction = new NonTerminal("subtraction"); var repetition = new NonTerminal("repetition"); var repeat = new NonTerminal("repeat"); var element = new NonTerminal("element"); var elements = new NonTerminal("elements"); var group = new NonTerminal("group"); var option = new NonTerminal("option"); var func = new NonTerminal("func"); var funcarg = new NonTerminal("funcarg"); var funcargs = new NonTerminal("funcargs"); // RULES hexval.Rule = hexdig1 + (hexvalps | (minus + hexdig2) | Empty); hexvalp.Rule = point + hexdig2; hexvalps.Rule = MakePlusRule(hexvalps, hexvalp); binval.Rule = bindig1 + (binvalps | (minus + bindig2) | Empty); binvalp.Rule = point + bindig2; binvalps.Rule = MakePlusRule(binvalps, binvalp); decval.Rule = decdig1 + (decvalps | (minus + decdig2) | Empty); decvalp.Rule = point + decdig2; decvalps.Rule = MakePlusRule(decvalps, decvalp); numval.Rule = ToTerm("%") + (binval | hexval | decval); BnfExpression rp = ToTerm("*"); if (mode == Mode.HttpCompatible) { rp = rp | "#"; } repeat.Rule = ((repeat1) | ((repeat1 | Empty) + rp + (repeat2 | Empty))); group.Rule = ToTerm("(") + alternation + ")"; option.Rule = ToTerm("[") + alternation + "]"; funcarg.Rule = alternation; funcargs.Rule = MakePlusRule(funcargs, ToTerm(","), funcarg); func.Rule = ToTerm("{") + funcname + "," + funcargs + "}"; alternation.Rule = MakePlusRule(alternation, ToTerm(alternationChar), subtraction); subtraction.Rule = MakePlusRule(subtraction, ToTerm("&!"), concatenation); concatenation.Rule = MakePlusRule(concatenation, repetition); repetition.Rule = (Empty | repeat) + element; element.Rule = rulename | group | option | numval | charval | func; elements.Rule = alternation; rule.Rule = NewLineStar + newrulename + (ToTerm("=") | ToTerm("=" + alternationChar)) + elements + NewLinePlus; rulelist.Rule = MakeStarRule(rulelist, rule); base.Root = rulelist; }