Last active
May 27, 2019 16:05
-
-
Save vrthra/72cfafff238057a833ac13e12c37fe01 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import string | |
| import tinycss | |
| import fuzzingbook | |
| from fuzzingbook import GrammarFuzzer | |
| import string | |
| CSS_GRAMMAR = { | |
| '<start>': ['<stylesheet>'], | |
| '<stylesheet>': ['<[CHARSET_SYM_STRING_SEMI]>? <[S_OR_CDO_OR_CDC]>* <[import_CDO_S_OR_CDC_S]>* <[stylesheet_closing_GROUPING]>*'], | |
| '<[CHARSET_SYM_STRING_SEMI]>': ['<CHARSET_SYM> <STRING> ;'], | |
| '<[S_OR_CDO_OR_CDC]>': ['<Sp>', '<CDO>', '<CDC>'], | |
| '<[import_CDO_S_OR_CDC_S]>': ['<import> <[CDO_S_OR_CDC_S]>*'], | |
| '<[CDO_S_OR_CDC_S]>': ['<CDO> <Ss>', '<CDC> <Ss>'], | |
| '<[ruleset_OR_media_OR_page]>': ['<ruleset>', '<media>', '<page>'], | |
| '<[stylesheet_closing_GROUPING]>': ['<[ruleset_OR_media_OR_page]> <[CDO_S_OR_CDC_S]>*'], | |
| '<import>': ['<IMPORT_SYM> <Ss> <[STRING_OR_URI]> <Ss> <media_list>? ; <Ss>'], | |
| '<[STRING_OR_URI]>': ['<STRING>', '<URI>'], | |
| '<media>': ['<MEDIA_SYM> <Ss> <media_list> { <Ss> <ruleset>* } <Ss>'], | |
| '<media_list>': ['<medium> <[COMMA_S_medium]>*'], | |
| '<[COMMA_S_medium]>': [', <Ss> <medium>'], | |
| '<medium>': ['<IDENT> <Ss>'], | |
| '<page>': ['<PAGE_SYM> <Ss> <pseudo_page>? { <Ss> <declaration>? <[SEMI_S_declaration]>* } <Ss>'], | |
| '<[SEMI_S_declaration]>': ['; <Ss> <declaration>?'], | |
| '<pseudo_page>': [': <IDENT> <Ss>'], | |
| '<operator>': ['/ <Ss>', ', <Ss>'], | |
| '<combinator>': ['+ <Ss>', '> <Ss>'], | |
| '<unary_operator>': ['-', '+'], | |
| '<property>': ['<IDENT> <Ss>'], | |
| '<ruleset>': ['<selector> <COMMA_S_selector>* { <Ss> <declaration>? <[SEMI_S_declaration]>* } <Ss>'], | |
| '<COMMA_S_selector>': [', <Ss> selector'], | |
| '<selector>': ['<simple_selector> <[combinator_selector_OR_S]>?'], | |
| '<[combinator_selector]>': ['<combinator>? <selector>'], | |
| '<[combinator_selector_OR_S]>': ['<combinator> <selector>', | |
| '<Sp> <[combinator_selector]>?'], | |
| '<simple_selector>': ['<element_name> <[HASH_OR_class_OR_attrib_OR_pseudo]>*', | |
| '<[HASH_OR_class_OR_attrib_OR_pseudo]>+'], | |
| '<[HASH_OR_class_OR_attrib_OR_pseudo]>': ['<HASH>', '<class>', | |
| '<attrib>', '<pseudo>'], | |
| '<class>': ['.<IDENT>'], | |
| '<element_name>': ['<IDENT>', '*'], | |
| '<attrib>': ['[ <Ss> <IDENT> <Ss> <[attrib_GROUPING]>? ]'], | |
| '<[EQUAL_OR_INCLUDES_OR_DASHMATCH]>': ['=', '<INCLUDES>', '<DASHMATCH>'], | |
| '<[IDENT_OR_STRING]>': ['<IDENT>', '<STRING>'], | |
| '<[attrib_GROUPING]>': ['<[EQUAL_OR_INCLUDES_OR_DASHMATCH]> <Ss> <[IDENT_OR_STRING]> <Ss>'], | |
| '<pseudo>': [': <[IDENT_OR_FUNCTION]>'], | |
| '<[IDENT_OR_FUNCTION]>': ['<IDENT>', | |
| '<FUNCTION> <Ss> <[IDENT_S]>? )'], | |
| '<[IDENT_S]>': ['<IDENT> <Ss>'], | |
| '<declaration>': ['<property> : <Ss> <expr> <prio>?'], | |
| '<prio>': ['<IMPORT_SYM> <Ss>'], | |
| '<expr>': ['<term> <[operator_term]>*'], | |
| '<[operator_term]>': ['<operator>? <term>'], | |
| '<term>': ['<unary_operator>? <[term_GROUPING]>', | |
| '<STRING> <Ss>', '<IDENT> <Ss>', '<URI> <Ss>', | |
| '<hexcolor>', '<function>'], | |
| '<[term_GROUPING]>': ['<NUMBER> <Ss>', '<PERCENTAGE> <Ss>', | |
| '<LENGTH> <Ss>', '<EMS> <Ss>', | |
| '<EXS> <Ss>', '<ANGLE> <Ss>', | |
| '<TIME> <Ss>', '<FREQ> <Ss>'], | |
| '<function>': ['<FUNCTION> <Ss> <expr> ) <Ss>'], | |
| '<hexcolor>': ['#<[three_char_HEX]> <Ss>', '#<[six_char_HEX]> <Ss>'], | |
| '<[three_char_HEX]>': ['<HEX_CHAR><HEX_CHAR><HEX_CHAR>'], | |
| '<[six_char_HEX]>': ['<HEX_CHAR><HEX_CHAR><HEX_CHAR><HEX_CHAR><HEX_CHAR><HEX_CHAR>'], | |
| '<HEX_CHAR>': ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', | |
| 'a', 'b', 'c', 'd', 'e', 'f'], | |
| '<Sp>': ['<WHITESPACE>+'], | |
| '<Ss>': ['<WHITESPACE>*'], | |
| '<So>': ['', '<WHITESPACE>'], | |
| '<CDO>': ['<!--'], | |
| '<CDC>': ['-->'], | |
| '<INCLUDES>': ['~='], | |
| '<DASHMATCH>': ['|='], | |
| '<STRING>': ['<string1>', '<string2>'], | |
| '<IDENT>': ['<{ident}>'], | |
| '<HASH>': ['#<{name}>'], | |
| '<IMPORT_SYM>': ['@import'], | |
| '<PAGE_SYM>': ['@page'], | |
| '<MEDIA_SYM>': ['@media'], | |
| '<CHARSET_SYM>': ['@charset'], | |
| '<EMS>': ['<{num}>em'], | |
| '<EXS>': ['<{num}>ex'], | |
| '<LENGTH>': ['<{num}>px', '<{num}>cm', '<{num}>mm', | |
| '<{num}>in', '<{num}>pt', '<{num}>pc'], | |
| '<ANGLE>': ['<{num}>deg', '<{num}>rad', '<{num}>grad'], | |
| '<TIME>': ['<{num}>ms', '<{num}>s'], | |
| '<FREQ>': ['<{num}>hz', '<{num}>khz'], | |
| '<PERCENTAGE>': ['<{num}>%'], | |
| '<NUMBER>': ['<{num}>'], | |
| '<URI>': [ | |
| 'url("<So><url><So>")', | |
| 'url("<So><STRING><So>")', | |
| ], | |
| '<url>': ['<url_>*'], | |
| '<url_>': list("!#$%&*-~") + ['<escape>'], | |
| '<FUNCTION>': ['<{ident}>('], | |
| '<string1>': ['"<qmychars1>*"'], | |
| '<string2>': ["'<qmychars2>*'"], | |
| '<qnonl1>': list(set(string.printable) - set('\n\r\f"')), | |
| '<qnonl2>': list(set(string.printable) - set('\n\r\f\'')), | |
| '<qmychars1>': ['<qnonl1>','\<nl>','<escape>'], | |
| '<qmychars2>': ['<qnonl2>','\<nl>','<escape>'], | |
| '<nl>': ['\r', '\n', '\f', '\r\n'], | |
| '<escape>': [ | |
| #'<unicode>', # TODO | |
| '\<echar>'], | |
| '<echar>': list(set(string.printable) - set('\r\n\f0123456789abcdef')), | |
| '<{ident}>': ['<minus>?<nmstart><nmchar>*'], | |
| '<nmstart>': list(string.ascii_lowercase) + ['<escape>', '_'], | |
| '<nmchar>': list(string.ascii_lowercase + string.digits) + ['<escape>', '_', '-'], | |
| '<minus>': ['-'], | |
| '<{name}>': ['<nmchar>+'], | |
| '<{num}>': ['<INTEGER>'], | |
| '<WHITESPACE>': [' ', '\t'], #list(string.whitespace), | |
| '<INTEGER>': ['<DIGIT><INTEGER>', '<DIGIT>'], | |
| '<DIGIT>': ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] | |
| } | |
| GrammarFuzzer.is_valid_grammar(CSS_GRAMMAR) | |
| from io import StringIO | |
| parser = tinycss.make_parser('page3') | |
| gf = GrammarFuzzer.GrammarFuzzer(GrammarFuzzer.convert_ebnf_grammar(CSS_GRAMMAR), min_nonterminals=100) | |
| Max = 1000 | |
| count = 0 | |
| for i in range(Max): | |
| p = gf.fuzz() | |
| with open('_.css', 'w+') as f: | |
| print(p, file=f) | |
| try: | |
| print(parser.parse_stylesheet(p)) | |
| print('+', repr(p)) | |
| print(p) | |
| count += 1 | |
| except: | |
| print('-', repr(p)) | |
| print(count, Max) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment