"This is a polyglot Python/JavaScript file."; add('comment', Diagram( '/*', ZeroOrMore( NonTerminal('anything but * followed by /')), '*/')); add('newline', Diagram(Choice(0, '\\n', '\\r\\n', '\\r', '\\f'))); add('whitespace', Diagram(Choice( 0, 'space', '\\t', NonTerminal('newline')))); add('hex digit', Diagram(NonTerminal('0-9 a-f or A-F'))); add('escape', Diagram( '\\', Choice(0, NonTerminal('not newline or hex digit'), Sequence( OneOrMore(NonTerminal('hex digit'), Comment('1-6 times')), Optional(NonTerminal('whitespace'), 'skip'))))); add('', Diagram(OneOrMore(NonTerminal('whitespace')))); add('ws*', Diagram(ZeroOrMore(NonTerminal('')))); add('', Diagram( Choice(0, Skip(), '-'), Choice(0, NonTerminal('a-z A-Z _ or non-ASCII'), NonTerminal('escape')), ZeroOrMore(Choice(0, NonTerminal('a-z A-Z 0-9 _ - or non-ASCII'), NonTerminal('escape'))))); add('', Diagram( NonTerminal(''), '(')); add('', Diagram( '@', NonTerminal(''))); add('', Diagram( '#', OneOrMore(Choice(0, NonTerminal('a-z A-Z 0-9 _ - or non-ASCII'), NonTerminal('escape'))))); add('', Diagram( Choice(0, Sequence( '"', ZeroOrMore( Choice(0, NonTerminal('not " \\ or newline'), NonTerminal('escape'), Sequence('\\', NonTerminal('newline')))), '"'), Sequence( '\'', ZeroOrMore( Choice(0, NonTerminal("not ' \\ or newline"), NonTerminal('escape'), Sequence('\\', NonTerminal('newline')))), '\'')))); add('', Diagram( NonTerminal(''), '(', NonTerminal('ws*'), Optional(Sequence( Choice(0, NonTerminal('url-unquoted'), NonTerminal('STRING')), NonTerminal('ws*'))), ')')); add('url-unquoted', Diagram(OneOrMore( Choice(0, NonTerminal('not " \' ( ) \\ whitespace or non-printable'), NonTerminal('escape'))))); add('', Diagram( Choice(1, '+', Skip(), '-'), Choice(0, Sequence( OneOrMore(NonTerminal('digit')), '.', OneOrMore(NonTerminal('digit'))), OneOrMore(NonTerminal('digit')), Sequence( '.', OneOrMore(NonTerminal('digit')))), Choice(0, Skip(), Sequence( Choice(0, 'e', 'E'), Choice(1, '+', Skip(), '-'), OneOrMore(NonTerminal('digit')))))); add('', Diagram( NonTerminal(''), NonTerminal(''))); add('', Diagram( NonTerminal(''), '%')); add('', Diagram( Choice(0, 'U', 'u'), '+', Choice(0, Sequence(OneOrMore(NonTerminal('hex digit'), Comment('1-6 times'))), Sequence( ZeroOrMore(NonTerminal('hex digit'), Comment('1-5 times')), OneOrMore('?', Comment('1 to (6 - digits) times'))), Sequence( OneOrMore(NonTerminal('hex digit'), Comment('1-6 times')), '-', OneOrMore(NonTerminal('hex digit'), Comment('1-6 times')))))); add('', Diagram('~=')); add('', Diagram('|=')); add('', Diagram('^=')); add('', Diagram('$=')); add('', Diagram('*=')); add('', Diagram('||')); add('', Diagram('<' + '!--')); add('', Diagram('-' + '->')); NonTerminal = NonTerminal; add('Stylesheet', Diagram(ZeroOrMore(Choice(3, NonTerminal(''), NonTerminal(''), NonTerminal(''), NonTerminal('Qualified rule'), NonTerminal('At-rule'))))); add('Rule list', Diagram(ZeroOrMore(Choice(1, NonTerminal(''), NonTerminal('Qualified rule'), NonTerminal('At-rule'))))); add('At-rule', Diagram( NonTerminal(''), ZeroOrMore(NonTerminal('Component value')), Choice(0, NonTerminal('{} block'), ';'))); add('Qualified rule', Diagram( ZeroOrMore(NonTerminal('Component value')), NonTerminal('{} block'))); add('Declaration list', Diagram( NonTerminal('ws*'), Choice(0, Sequence( Optional(NonTerminal('Declaration')), Optional(Sequence(';', NonTerminal('Declaration list')))), Sequence( NonTerminal('At-rule'), NonTerminal('Declaration list'))))); add('Declaration', Diagram( NonTerminal(''), NonTerminal('ws*'), ':', ZeroOrMore(NonTerminal('Component value')), Optional(NonTerminal('!important')))); add('!important', Diagram( '!', NonTerminal('ws*'), NonTerminal(''), NonTerminal('ws*'))); add('Component value', Diagram(Choice(0, NonTerminal('Preserved token'), NonTerminal('{} block'), NonTerminal('() block'), NonTerminal('[] block'), NonTerminal('Function block')))); add('{} block', Diagram('{', ZeroOrMore(NonTerminal('Component value')), '}')); add('() block', Diagram('(', ZeroOrMore(NonTerminal('Component value')), ')')); add('[] block', Diagram('[', ZeroOrMore(NonTerminal('Component value')), ']')); add('Function block', Diagram( NonTerminal(''), ZeroOrMore(NonTerminal('Component value')), ')'));