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); }
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); }
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)); }
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))); }
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)); }
public EbnfLexerRule(EbnfQualifiedIdentifier identifier, IEbnfLexerRuleExpression expression) { Identifier = identifier; Expression = expression; }
public EbnfLexerRuleExpressionAlteration(IEbnfLexerRuleTerm term, IEbnfLexerRuleExpression expression) { Term = term; Expression = expression; }