Example #1
0
        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();
            }
        }
Example #2
0
        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));
        }
Example #3
0
 public EbnfDefinitionConcatenation(IEbnfBlock block, IEbnfDefinition definition)
 {
     Block      = block;
     Definition = definition;
 }
Example #4
0
 public EbnfDefinitionSimple(IEbnfBlock block)
 {
     Block = block;
 }