Skip to content

Commit

Permalink
WIP python port, for use in Bikeshed.
Browse files Browse the repository at this point in the history
[Bikeshed](https://github.com/tabatkins/bikeshed).

**Not ready to merge yet.** Opening a PR in case someone wants to pick this up,
as I will not be working on this for a while.

This is still buggy, and based on an older version
of the JS implementation: fe2ff11
  • Loading branch information
SimonSapin committed Sep 18, 2013
1 parent 606514a commit 1647602
Show file tree
Hide file tree
Showing 2 changed files with 551 additions and 0 deletions.
183 changes: 183 additions & 0 deletions css-example.py-js
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
"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('<whitespace-token>', Diagram(OneOrMore(NonTerminal('whitespace'))));

add('ws*', Diagram(ZeroOrMore(NonTerminal('<whitespace-token>'))));

add('<ident-token>', 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('<function-token>', Diagram(
NonTerminal('<ident-token>'), '('));

add('<at-keyword-token>', Diagram(
'@', NonTerminal('<ident-token>')));

add('<hash-token>', Diagram(
'#', OneOrMore(Choice(0,
NonTerminal('a-z A-Z 0-9 _ - or non-ASCII'),
NonTerminal('escape')))));

add('<string-token>', 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('<url-token>', Diagram(
NonTerminal('<ident-token "url">'),
'(',
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('<number-token>', 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('<dimension-token>', Diagram(
NonTerminal('<number-token>'), NonTerminal('<ident-token>')));

add('<percentage-token>', Diagram(
NonTerminal('<number-token>'), '%'));

add('<unicode-range-token>', 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('<include-match-token>', Diagram('~='));

add('<dash-match-token>', Diagram('|='));

add('<prefix-match-token>', Diagram('^='));

add('<suffix-match-token>', Diagram('$='));

add('<substring-match-token>', Diagram('*='));

add('<column-token>', Diagram('||'));

add('<CDO-token>', Diagram('<' + '!--'));

add('<CDC-token>', Diagram('-' + '->'));


NonTerminal = NonTerminal;

add('Stylesheet', Diagram(ZeroOrMore(Choice(3,
NonTerminal('<CDO-token>'), NonTerminal('<CDC-token>'), NonTerminal('<whitespace-token>'),
NonTerminal('Qualified rule'), NonTerminal('At-rule')))));

add('Rule list', Diagram(ZeroOrMore(Choice(1,
NonTerminal('<whitespace-token>'), NonTerminal('Qualified rule'), NonTerminal('At-rule')))));

add('At-rule', Diagram(
NonTerminal('<at-keyword-token>'), 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('<ident-token>'), NonTerminal('ws*'), ':',
ZeroOrMore(NonTerminal('Component value')), Optional(NonTerminal('!important'))));

add('!important', Diagram(
'!', NonTerminal('ws*'), NonTerminal('<ident-token "important">'), 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('<function-token>'),
ZeroOrMore(NonTerminal('Component value')),
')'));

Loading

0 comments on commit 1647602

Please sign in to comment.