Example #1
0
        public void GrammarShouldContainAllLexerRulesInReferencedGrammars()
        {
            var regex = new GrammarReferenceExpression(new RegexGrammar());
            ProductionExpression
                S = "S";

            S.Rule = regex;
            var grammarExpression = new GrammarExpression(S);
            var grammar           = grammarExpression.ToGrammar();

            Assert.IsNotNull(grammar.LexerRules);
            Assert.AreEqual(15, grammar.LexerRules.Count);
        }
Example #2
0
        static EbnfGrammar()
        {
            LexerRule
                settingIdentifier = CreateSettingIdentifierLexerRule(),
                identifier        = CreateIdentifierLexerRule(),
                whitespace        = CreateWhitespaceLexerRule(),
                multiLineComment  = CreateMultiLineCommentLexerRule();

            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 regexProductionReference = new GrammarReferenceExpression(new 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 SimpleSingleQuoteStringLexerRule()
                           | new SimpleDoubleQuoteStringLexerRule();

            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[] { whitespace, multiLineComment });

            ebnfGrammar = grammarExpression.ToGrammar();
        }