コード例 #1
0
        private bool TryRecognizeSimpleLiteralExpression(
            QualifiedName fullyQualifiedName,
            IEbnfLexerRuleExpression ebnfLexerRule,
            out LexerRule lexerRule)
        {
            lexerRule = null;

            if (ebnfLexerRule is EbnfLexerRuleExpressionSimple)
            {
                var term = ebnfLexerRule.Term;
                if (term is EbnfLexerRuleTermConcatenation)
                {
                    return(false);
                }

                var factor = term.Factor;
                if (factor is EbnfLexerRuleFactorLiteral literal)
                {
                    lexerRule = new StringLiteralLexerRule(literal.Value, new TokenName(fullyQualifiedName.FullName));

                    return(true);
                }
            }

            return(false);
        }
コード例 #2
0
        private Nfa LexerRuleExpression(IEbnfLexerRuleExpression expression)
        {
            var nfa = LexerRuleTerm(expression.Term);

            if (expression is EbnfLexerRuleExpressionAlteration alteration)
            {
                var alterationNfa = LexerRuleExpression(alteration);
                nfa = nfa.Union(alterationNfa);
            }

            return(nfa);
        }
コード例 #3
0
        private LexerRule LexerRuleExpression(
            QualifiedName fullyQualifiedName,
            IEbnfLexerRuleExpression ebnfLexerRule)
        {
            if (TryRecognizeSimpleLiteralExpression(fullyQualifiedName, ebnfLexerRule, out var lexerRule))
            {
                return(lexerRule);
            }

            var nfa = LexerRuleExpression(ebnfLexerRule);
            var dfa = this.nfaToDfa.Transform(nfa);

            return(new DfaLexerRule(dfa, fullyQualifiedName.FullName));
        }
コード例 #4
0
        private EbnfBlockLexerRule VisitLexerRuleNode(IInternalTreeNode node)
        {
            EbnfQualifiedIdentifier  identifier = null;
            IEbnfLexerRuleExpression expression = null;

            foreach (var internalNode in node.Children.OfType <IInternalTreeNode>())
            {
                if (internalNode.Is(EbnfGrammar.QualifiedIdentifier))
                {
                    identifier = VisitQualifiedIdentifierNode(internalNode);
                }
                else if (internalNode.Is(EbnfGrammar.LexerRuleExpression))
                {
                    expression = VisitLexerRuleExpressionNode(internalNode);
                }
            }

            return(new EbnfBlockLexerRule(new EbnfLexerRule(identifier, expression)));
        }
コード例 #5
0
        private IEbnfLexerRuleExpression VisitLexerRuleExpressionNode(IInternalTreeNode node)
        {
            IEbnfLexerRuleTerm       term       = null;
            IEbnfLexerRuleExpression expression = null;

            foreach (var internalNode in node.Children.OfType <IInternalTreeNode>())
            {
                if (internalNode.Is(EbnfGrammar.LexerRuleTerm))
                {
                    term = VisitLexerRuleTermNode(internalNode);
                }
                else if (internalNode.Is(EbnfGrammar.LexerRuleExpression))
                {
                    expression = VisitLexerRuleExpressionNode(internalNode);
                }
            }

            if (expression == null)
            {
                return(new EbnfLexerRuleExpressionSimple(term));
            }

            return(new EbnfLexerRuleExpressionAlteration(term, expression));
        }
コード例 #6
0
 public EbnfLexerRule(EbnfQualifiedIdentifier identifier, IEbnfLexerRuleExpression expression)
 {
     Identifier = identifier;
     Expression = expression;
 }
コード例 #7
0
 public EbnfLexerRuleExpressionAlteration(IEbnfLexerRuleTerm term, IEbnfLexerRuleExpression expression)
 {
     Term       = term;
     Expression = expression;
 }