bs = Group(shell + OneOrMore(exponent)) bs_sp = Group(shell_sp + OneOrMore(exponent_sp)) endbs = Word('*').suppress() basis_set = Group( Str.setResultsName('bdescr') + Number + OneOrMore(bs | bs_sp).setResultsName('basis') + Optional(endbs)) ecp_body = OneOrMore(eol + SkipTo(eol).suppress() + Group(Number + OneOrMore(Group(Number + Number + Number)))) ecp = Group( Str.setResultsName('edescr') + Number.suppress() + SkipTo(Number).suppress() + Number.setResultsName('lmax') + Number.setResultsName('core') + ecp_body.setResultsName('ecp')) # define grammar here grammar = Optional(OneOrMore(comment)) + Optional(endbs) \ + Group(OneOrMore(basis_set)) + Optional(OneOrMore(comment)) \ + Optional(Group(OneOrMore(ecp))) lstr = { 'S': 0, 'SP': 1, 'P': 2, 'D': 3, 'F': 4,
def bnf(css_style_obj): """ * decimal_digit :: '0' .. '9' * sign :: '-' | '+' * integer :: decimal_digit+ * float :: [ sign ] integer '.' [ integer ] [ 'e' | 'E' [ sign ] integer ] * lower_case :: 'a' .. 'z' * upper_case :: 'A' .. 'Z' * alpha :: lower_case | upper_case * punctuation :: '`' | '~' | '!' | '@' | '#' | '$' | '%' | '^' | '&' | '*' | '(' | ')' | '_' | '=' | '+' | ';' | ':' | '\'' | ',' | '<' | '.' | '>' | '/' | '?' | ' ' | '-' * string_delim :: '"' | '\'' * string :: string_delim [ alpha | decimal_digit | punctuation ]* string_delim * identifier :: '_' | alpha [ alpha | decimal_digit | '_' ]* * attr_selector :: '[' + identifier [ [ '~' | '*' | '^' | '$' | '|' ] '=' string ] ']' * class_or_id :: ( '#' | '.' ) identifier * pseudo_class :: ':' alpha [ alpha | '-' ]* [ '(' integer | identifier ')' ] * selector :: identifier [ class_or_id | attr_selector ] [ pseudo_class ] [ identifier [ pseudo_class ] ] * parameter_name :: alpha [ alpha | decimal_digit | '_' | '-' ]* * lower_hex :: 'a' .. 'f' * upper_hex :: 'A' .. 'F' * hex_digit :: decimal_digit | lower_hex | upper_hex * color :: '#' hex_digit * 6 * comment :: '/' '*' .*? '*' '/' * url :: 'url' '(' string ')' * pixel_count :: integer 'px' * percentage :: integer '%' * parameter_val :: url | color | pixel_count | percentage | parameter_name | float | integer * parameter :: parameter_name ':' [ comment* ]* parameter_val [ parameter_val | comment* ]+ ';' * parameter_block :: selector [ ',' selector ]* '{' ( parameter | comment* )+ '}' """ global BNF if BNF is None: fnumber = Regex(r"[+-]?\d+(:?\.\d*)?(:?[eE][+-]?\d+)?") identifier = Word("_"+alphas+nums) tilde = Literal("~") asterisk = Literal("*") caret = Literal("^") dsign = Literal("$") pipe = Literal("|") equal = Literal("=") squote = Literal("'") sqstring = squote + Regex(r"[^']+") + squote dquote = Literal('"') dqstring = dquote + Regex(r"[^\"]+") + dquote string = sqstring | dqstring class_or_id = Word("#"+".", "_"+alphas+nums) pclass = Combine(Word(":", "-"+alphas) + Optional( '(' + (Word(nums) | identifier) + ')')) attr_selector = Combine("[" + identifier + Optional(Optional( tilde | asterisk | caret | dsign | pipe) + equal + string) + "]") selector = Combine(Word("_"+alphas, "_"+alphas+nums) + Optional( attr_selector | class_or_id) + Optional(pclass)) | Combine( class_or_id + Optional(pclass)) | attr_selector integer = Word(nums) parameter_name = Word(alphas, alphas + nums + "_-") param_str = Word(alphas, alphas + nums + "_-") comment = Regex(r"[/][*].*?[*][/]", flags=re.S) lbrack = Literal("{") rbrack = Literal("}") px_suffix = Literal("px") pix_count = Combine(Word(nums) + px_suffix) percent = Literal("%") percentage = Combine(Word(nums) + percent) color = Word("#", hexnums, exact=7) urlstr = Keyword("url") url = urlstr + '(' + string + ')' parameter_val = url | color | pix_count | percentage | param_str | fnumber | integer parameter = (parameter_name.setParseAction( css_style_obj.push_param_name) + ':' + ZeroOrMore(comment.suppress()) + OneOrMore( parameter_val.setParseAction(css_style_obj.push_value) + ZeroOrMore( comment.suppress())) + ';').setParseAction(css_style_obj.push_parameter) parameter_block = (delimitedList(selector).setParseAction( css_style_obj.push_ident_list) + lbrack + OneOrMore( comment.suppress() | parameter) + rbrack).setParseAction( css_style_obj.push_param_block) BNF = OneOrMore(comment.suppress() | parameter_block) return BNF