source: proto/REgen/ABNF-bootstrap.py @ 1495

Last change on this file since 1495 was 892, checked in by cameron, 9 years ago

REgen: regexp generator for ABNF

File size: 3.5 KB
Line 
1#
2#  ABNF-bootstrap.py
3#
4#  The following handwritten abstract syntax for ABNF may be used
5#  to bootstrap ABNF parsing components.
6#
7#  Once those components are generated, they may be used to parse
8#  the ABNF grammar in ABNF to generate the "proper" implementation.
9#
10#  Robert D. Cameron, May 5, 2003
11#
12from REbuild import *
13
14ABNF = [Rule(Var('comment'), JoinList([Literal(';'),
15                                       Star(AltList([Var('WSP'), Var('VCHAR')])),
16                                       Var('CRLF')])),
17        Rule(Var('c-nl'), AltList([Var('comment'), Var('CRLF')])),
18        Rule(Var('c-wsp'), AltList([Var('WSP'), JoinList([Var('c-nl'), Var('WSP')])])),
19        Rule(Var('char-val'),
20             JoinList([Var('DQUOTE'),
21                       Star(AltList([CharRange(chr(32), chr(33)),
22                                     CharRange(chr(35), chr(126))])),
23                       Var('DQUOTE')])),
24        Rule(Var('hex-val'),
25             JoinList([Literal('x'),
26                       Plus(Var('HEXDIG')),
27                       Opt(AltList([Plus(JoinList([Literal('.'), Plus(Var('HEXDIG'))])),
28                                    JoinList([Literal('-'), Plus(Var('HEXDIG'))])]))])),
29        Rule(Var('dec-val'),
30             JoinList([Literal('d'),
31                       Plus(Var('DIGIT')),
32                       Opt(AltList([Plus(JoinList([Literal('.'), Plus(Var('DIGIT'))])),
33                                    JoinList([Literal('-'), Plus(Var('DIGIT'))])]))])),
34        Rule(Var('bin-val'),
35             JoinList([Literal('b'),
36                       Plus(Var('BIT')),
37                       Opt(AltList([Plus(JoinList([Literal('.'), Plus(Var('BIT'))])),
38                                    JoinList([Literal('-'), Plus(Var('BIT'))])]))])),
39        Rule(Var('prose-val'),
40             JoinList([Literal('<'),
41                       Star(AltList([CharRange(chr(32), chr(61)),
42                                     CharRange(chr(63), chr(126))])),
43                       Literal('>')])),
44        Rule(Var('num-val'),
45             JoinList([Literal('%'),
46                       AltList([Var('bin-val'), Var('dec-val'), Var('hex-val')])])),
47        Rule(Var('rulename'),
48             JoinList([Var('ALPHA'),
49                       Star(AltList([Var('ALPHA'), Var('DIGIT'), Literal('-')]))])),
50        Rule(Var('defined-as'),
51             JoinList([Star(Var('c-wsp')),
52                       AltList([Literal('='), Literal('/=')]),
53                       Star(Var('c-wsp'))])),
54        Rule(Var('repeat'),
55             AltList([Plus(Var('DIGIT')),
56                      JoinList([Star(Var('DIGIT')), Literal('*'), Star(Var('DIGIT'))])])),
57        Rule(Var('ALPHA'), AltList([CharRange(chr(65), chr(90)),
58                                    CharRange(chr(97), chr(122))])),
59        Rule(Var('DQUOTE'), Literal('"')),
60        Rule(Var('LF'), Literal(chr(10))),
61        Rule(Var('CR'), Literal(chr(13))),
62        Rule(Var('HTAB'), Literal(chr(9))),
63        Rule(Var('SP'), Literal(chr(32))),
64        Rule(Var('WSP'), AltList([Var('SP'), Var('HTAB')])),
65        Rule(Var('CRLF'), JoinList([Var('CR'), Var('LF')])),
66        Rule(Var('VCHAR'), CharRange(chr(33), chr(126))),
67        Rule(Var('BIT'), AltList([Literal('0'), Literal('1')])),
68        Rule(Var('DIGIT'), CharRange(chr(48), chr(57))),
69        Rule(Var('HEXDIG'), AltList([Var('DIGIT'),
70                                     Literal('A'), Literal('B'), Literal('C'),
71                                     Literal('D'), Literal('E'), Literal('F')]))
72        ]
73
74sABNF = simplify_grammar(ABNF)
75
76print grammar_gen(regular_subgrammar(sABNF), pySyntax)
77
Note: See TracBrowser for help on using the repository browser.