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); }