private IEnumerable <ProductionModel> Expression(IEbnfExpression expression, ProductionModel currentProduction) { foreach (var production in Term(expression.Term, currentProduction)) { yield return(production); } if (expression is EbnfExpressionAlteration expressionAlteration) { currentProduction.Lambda(); foreach (var production in Expression(expressionAlteration.Expression, currentProduction)) { yield return(production); } } }
private EbnfBlockRule VisitRuleNode(IInternalTreeNode node) { EbnfQualifiedIdentifier qualifiedEbnfQualifiedIdentifier = null; IEbnfExpression expression = null; foreach (var internalNode in node.Children.OfType <IInternalTreeNode>()) { if (internalNode.Is(EbnfGrammar.QualifiedIdentifier)) { qualifiedEbnfQualifiedIdentifier = VisitQualifiedIdentifierNode(internalNode); } else if (internalNode.Is(EbnfGrammar.Expression)) { expression = VisitExpressionNode(internalNode); } } return(new EbnfBlockRule(new EbnfRule(qualifiedEbnfQualifiedIdentifier, expression))); }
private IEbnfExpression VisitExpressionNode(IInternalTreeNode node) { IEbnfTerm term = null; IEbnfExpression expression = null; foreach (var internalNode in node.Children.OfType <IInternalTreeNode>()) { if (internalNode.Is(EbnfGrammar.Term)) { term = VisitTermNode(internalNode); } else if (internalNode.Is(EbnfGrammar.Expression)) { expression = VisitExpressionNode(internalNode); } } if (expression == null) { return(new EbnfExpressionSimple(term)); } return(new EbnfExpressionAlteration(term, expression)); }
public EbnfRule(EbnfQualifiedIdentifier identifier, IEbnfExpression expression) { Identifier = identifier; Expression = expression; }
public EbnfFactorRepetition(IEbnfExpression expression) { Expression = expression; }
public EbnfFactorGrouping(IEbnfExpression expression) { Expression = expression; }
public EbnfFactorOptional(IEbnfExpression expression) { Expression = expression; }
public EbnfExpressionAlteration(IEbnfTerm term, IEbnfExpression expression) { Term = term; Expression = expression; }