public void GrammarShouldContainAllLexerRulesInReferencedGrammars() { var regex = new ProductionReferenceExpression(new RegexGrammar()); ProductionExpression S = nameof(S); S.Rule = regex; var grammarExpression = new GrammarExpression(S); var grammar = grammarExpression.ToGrammar(); Assert.IsNotNull(grammar.LexerRules); Assert.AreEqual(15, grammar.LexerRules.Count); }
static PdlGrammar() { BaseLexerRule settingIdentifier = SettingIdentifier(), notDoubleQuote = NotDoubleQuote(), notSingleQuote = NotSingleQuote(), identifier = Identifier(), any = new TerminalLexerRule(new AnyTerminal(), "."), notCloseBracket = new TerminalLexerRule( new NegationTerminal(new CharacterTerminal(']')), "[^\\]]"), escapeCharacter = EscapeCharacter(), whitespace = Whitespace(), multiLineComment = MultiLineComment(); ProductionExpression definition = Definition, block = Block, rule = Rule, setting = Setting, lexerRule = LexerRule, qualifiedIdentifier = QualifiedIdentifier, expression = Expression, term = Term, factor = Factor, literal = Literal, grouping = Grouping, repetition = Repetition, optional = Optional, lexerRuleExpression = LexerRuleExpression, lexerRuleTerm = LexerRuleTerm, lexerRuleFactor = LexerRuleFactor; var regexGrammar = new RegexGrammar(); var regexProductionReference = new ProductionReferenceExpression(regexGrammar); definition.Rule = block | block + definition; block.Rule = rule | setting | lexerRule; rule.Rule = qualifiedIdentifier + '=' + expression + ';'; setting.Rule = (Expr) settingIdentifier + '=' + qualifiedIdentifier + ';'; lexerRule.Rule = qualifiedIdentifier + '~' + lexerRuleExpression + ';'; expression.Rule = term | term + '|' + expression; term.Rule = factor | factor + term; factor.Rule = qualifiedIdentifier | literal | '/' + regexProductionReference + '/' | repetition | optional | grouping; literal.Rule = (Expr) new SingleQuoteStringLexerRule() | new DoubleQuoteStringLexerRule(); repetition.Rule = (Expr) '{' + expression + '}'; optional.Rule = (Expr) '[' + expression + ']'; grouping.Rule = (Expr) '(' + expression + ')'; qualifiedIdentifier.Rule = identifier | (Expr)identifier + '.' + qualifiedIdentifier; lexerRuleExpression.Rule = lexerRuleTerm | lexerRuleTerm + '|' + lexerRuleExpression; lexerRuleTerm.Rule = lexerRuleFactor | lexerRuleFactor + lexerRuleTerm; lexerRuleFactor.Rule = literal | '/' + regexProductionReference + '/'; var grammarExpression = new GrammarExpression( definition, new[] { definition, block, rule, setting, lexerRule, expression, term, factor, literal, repetition, optional, grouping, qualifiedIdentifier, lexerRuleExpression, lexerRuleTerm, lexerRuleFactor }, new[] { new LexerRuleModel(whitespace), new LexerRuleModel(multiLineComment) }); _pdlGrammar = grammarExpression.ToGrammar(); }