public XmlGrammar()
            : base(false)
        {
            //Terminals
            Terminal comment = new CommentTerminal("comment", "<!--", "-->");

            NonGrammarTerminals.Add(comment);
            StringLiteral stringLiteral          = new StringLiteral("string", "\"", StringOptions.None);
            Terminal      stringContent          = new ToTerminatorTerminal("StringContent", '<');
            KeyTerm       elementOpener          = ToTerm("<");
            KeyTerm       closeElementOpener     = ToTerm("</");
            KeyTerm       elementCloser          = ToTerm(">");
            KeyTerm       openCloseElementCloser = ToTerm("/>");
            KeyTerm       equals       = ToTerm("=");
            KeyTerm       xmlDeclOpen  = ToTerm("<?");
            KeyTerm       xmlDeclClose = ToTerm("?>");

            IdentifierTerminal attributeIdentifier      = new IdentifierTerminal(AttributeIdentifier, ".", ".");
            IdentifierTerminal elementIdentifier        = new IdentifierTerminal(ElementIdentifier, ".-", ".-");
            KeyTerm            xmlDeclarationIdentifier = ToTerm("xml");

            //Non Terminals
            NonTerminal document               = new NonTerminal("document");
            NonTerminal elementStart           = new NonTerminal("ElementStart");
            NonTerminal elementEnd             = new NonTerminal("ElementEnd");
            NonTerminal openCloseElement       = new NonTerminal("OpenCloseElement");
            NonTerminal element                = new NonTerminal("Element");
            NonTerminal requiredElements       = new NonTerminal("RequiredElements");
            NonTerminal innerContent           = new NonTerminal("InnerContent");
            NonTerminal content                = new NonTerminal("Content");
            NonTerminal attribute              = new NonTerminal("Attribute");
            NonTerminal optionalAttribute      = new NonTerminal("OptionalAttribute");
            NonTerminal xmlDeclaration         = new NonTerminal("XmlDeclaration");
            NonTerminal optionalXmlDeclaration = new NonTerminal("OptionalXmlDeclaration");

            //Rules
            this.Root = document;

            innerContent.Rule = element | stringContent;
            content.Rule      = MakeStarRule(content, innerContent);

            attribute.Rule         = attributeIdentifier + equals + stringLiteral;
            optionalAttribute.Rule = MakeStarRule(optionalAttribute, attribute);

            elementStart.Rule     = elementOpener + elementIdentifier + optionalAttribute + elementCloser;
            elementEnd.Rule       = closeElementOpener + elementIdentifier + elementCloser;
            openCloseElement.Rule = elementOpener + elementIdentifier + optionalAttribute + openCloseElementCloser;

            element.Rule          = (elementStart + content + elementEnd) | openCloseElement;
            requiredElements.Rule = MakePlusRule(requiredElements, element);

            xmlDeclaration.Rule         = xmlDeclOpen + xmlDeclarationIdentifier + optionalAttribute + xmlDeclClose;
            optionalXmlDeclaration.Rule = MakeStarRule(optionalXmlDeclaration, xmlDeclaration);

            document.Rule = optionalXmlDeclaration + requiredElements;

            MarkPunctuation(elementOpener, elementCloser, closeElementOpener, openCloseElementCloser, equals, xmlDeclOpen, xmlDeclClose);
            MarkTransient(innerContent);
        }
        public CssGrammar()
            : base(false)
        {
            //Terminals
            Terminal comment = new CommentTerminal("comment", "/*", "*/");

            NonGrammarTerminals.Add(comment);
            ToTerminatorTerminal attributeSelector = new ToTerminatorTerminal("AttributeSelectorContent", ']');

            IdentifierTerminal   simpleSelectorId = new IdentifierTerminal(SimpleSelectorIdentifier, ".-*#", ".-*#");
            IdentifierTerminal   pseudoClassId    = new IdentifierTerminal(PseudoClassIdentifier, "-)(", "-)(");
            IdentifierTerminal   propertyId       = new IdentifierTerminal(Property, "-", "-");
            ToTerminatorTerminal valueId          = new ToTerminatorTerminal(Value, ';');

            valueId.EditorInfo = new TokenEditorInfo(TokenType.Identifier, TokenColor.Identifier, TokenTriggers.None);

            KeyTerm blockOpen            = ToTerm("{");
            KeyTerm blockClose           = ToTerm("}");
            KeyTerm semi                 = ToTerm(";");
            KeyTerm colin                = ToTerm(":");
            KeyTerm childChain           = ToTerm(">");
            KeyTerm siblingProceed       = ToTerm("+");
            KeyTerm groupDelim           = ToTerm(",");
            KeyTerm attributeSelectOpen  = ToTerm("[");
            KeyTerm attributeSelectClose = ToTerm("]");

            //Non Terminals
            NonTerminal css                    = new NonTerminal("CSS");
            NonTerminal rule                   = new NonTerminal("Rule");
            NonTerminal rules                  = new NonTerminal("Rules");
            NonTerminal declaration            = new NonTerminal("Declaration");
            NonTerminal declarations           = new NonTerminal("Declarations");
            NonTerminal pseudoClassRule        = new NonTerminal("PseudoClassRule");
            NonTerminal pseudoClasses          = new NonTerminal("PseudoClasses");
            NonTerminal selectorChain          = new NonTerminal("Chain");
            NonTerminal selectorChainDelim     = new NonTerminal("ChainDelim");
            NonTerminal selectorGroup          = new NonTerminal("SelectorGroup");
            NonTerminal selector               = new NonTerminal("Selector");
            NonTerminal optAttributeSelector   = new NonTerminal("OptAttributeSelector");
            NonTerminal multiAttributeSelector = new NonTerminal("MultiAttributeSelector");
            NonTerminal simpleSelectorWithAttributeSelector = new NonTerminal("simpleSelectorWithAttributeSelector");

            //Rules
            this.Root = css;

            optAttributeSelector.Rule   = attributeSelectOpen + attributeSelector + attributeSelectClose;
            multiAttributeSelector.Rule = MakeStarRule(multiAttributeSelector, optAttributeSelector);
            pseudoClassRule.Rule        = colin + pseudoClassId;
            pseudoClasses.Rule          = MakeStarRule(pseudoClasses, pseudoClassRule);
            simpleSelectorWithAttributeSelector.Rule = simpleSelectorId + multiAttributeSelector;
            selectorChainDelim.Rule = childChain | siblingProceed | Empty;
            selectorChain.Rule      = MakePlusRule(selectorChain, selectorChainDelim, simpleSelectorWithAttributeSelector);
            selector.Rule           = selectorChain + pseudoClasses;
            selectorGroup.Rule      = MakePlusRule(selectorGroup, groupDelim, selector);

            declaration.Rule  = propertyId + colin + valueId + semi;
            declarations.Rule = MakeStarRule(declarations, declaration);

            rule.Rule  = selectorGroup + blockOpen + declarations + blockClose;
            rules.Rule = MakeStarRule(rules, rule);

            css.Rule = rules;

            MarkPunctuation(blockOpen, blockClose, semi, colin, attributeSelectOpen, attributeSelectClose);
            MarkTransient(pseudoClassRule, multiAttributeSelector, pseudoClasses);
        }