private void Block(IEbnfBlock block, GrammarModel grammarModel) { switch (block) { case EbnfBlockLexerRule blockLexerRule: grammarModel.AddLexerRule(LexerRule(blockLexerRule)); break; case EbnfBlockRule blockRule: foreach (var production in Rule(blockRule.Rule)) { grammarModel.AddProduction(production); } break; case EbnfBlockSetting blockSetting: switch (blockSetting.Setting.SettingIdentifier.Value) { case StartProductionSettingModel.SettingKey: grammarModel.StartSetting = StartSetting(blockSetting); break; case IgnoreSettingModel.SettingKey: grammarModel.AddIgnoreSetting(IgnoreSetting(blockSetting)); break; case TriviaSettingModel.SettingKey: grammarModel.AddTriviaSetting(TriviaSetting(blockSetting)); break; default: throw new NotImplementedException($"invalid setting `{blockSetting.Setting.SettingIdentifier}´" + $" with value `{blockSetting.Setting.Identifier}´"); } break; default: throw new NotImplementedException(); } }
private IEbnfDefinition VisitDefinitionNode(IInternalTreeNode node) { IEbnfBlock block = null; IEbnfDefinition definition = null; foreach (var internalNode in node.Children.OfType <IInternalTreeNode>()) { if (internalNode.Is(EbnfGrammar.Block)) { block = VisitBlockNode(internalNode); } else if (internalNode.Is(EbnfGrammar.Definition)) { definition = VisitDefinitionNode(internalNode); } } if (definition == null) { return(new EbnfDefinitionSimple(block)); } return(new EbnfDefinitionConcatenation(block, definition)); }
public EbnfDefinitionConcatenation(IEbnfBlock block, IEbnfDefinition definition) { Block = block; Definition = definition; }
public EbnfDefinitionSimple(IEbnfBlock block) { Block = block; }