]>
Commit | Line | Data |
---|---|---|
1 | #!/usr/bin/python | |
2 | ||
3 | import sys | |
4 | ||
5 | lines = sys.stdin.read().rstrip('\n').split('\n') | |
6 | ||
7 | def data(line): | |
8 | name = line[0].replace('&', 'Ampersand').replace('^', 'Carrot').replace('=', 'Equal').replace('!', 'Exclamation').replace('-', 'Hyphen').replace('<', 'Left').replace('%', 'Percent').replace('.', 'Period').replace('|', 'Pipe').replace('+', 'Plus').replace('>', 'Right').replace('/', 'Slash').replace('*', 'Star').replace('~', 'Tilde') | |
9 | text = line[0].lower() | |
10 | word = text[0].isalpha() | |
11 | prefix = None if line[1] == '-' else line[1] | |
12 | assign = None if len(line) < 3 or line[2] != 'A' else '' if len(line) < 4 else line[3] | |
13 | infix = None if len(line) < 3 or line[2] != 'R' else line[3] | |
14 | precedence = line[4] if infix != None and len(line) > 4 else None | |
15 | postfix = infix if infix != None and precedence == None else None | |
16 | if postfix != None: | |
17 | infix = None | |
18 | return name, text, word, prefix, assign, infix, precedence, postfix | |
19 | ||
20 | def express(expression, type, args, call): | |
21 | print 'struct CYExpression%(expression)s :' % locals() | |
22 | print ' CYExpression%(type)s' % locals() | |
23 | print '{' | |
24 | print ' CYExpression%(expression)s(%(args)s) :' % locals() | |
25 | print ' CYExpression%(type)s(%(call)s)' % locals() | |
26 | print ' {' | |
27 | print ' }' | |
28 | print '};' | |
29 | ||
30 | ||
31 | for line in lines: | |
32 | line = line.split() | |
33 | name, text, word, prefix, assign, infix, precedence, postfix = data(line) | |
34 | ||
35 | print 'struct CYToken%(name)s :' % locals() | |
36 | if prefix != None: | |
37 | print ' CYTokenPrefix,' | |
38 | if infix != None: | |
39 | print ' CYTokenInfix,' | |
40 | if postfix != None: | |
41 | print ' CYTokenPostfix,' | |
42 | if assign != None: | |
43 | print ' CYTokenAssignment,' | |
44 | if word: | |
45 | print ' CYTokenWord,' | |
46 | print ' virtual CYToken' | |
47 | print '{' | |
48 | print ' virtual const char *Text() const {' | |
49 | print ' return "%(text)s";' % locals() | |
50 | print ' }' | |
51 | if precedence != None or prefix != None or assign != None or infix != None: | |
52 | ||
53 | if precedence != None: | |
54 | print ' virtual unsigned Precedence() const {' | |
55 | print ' return %(precedence)s;' % locals() | |
56 | print ' }' | |
57 | ||
58 | if prefix != None: | |
59 | print ' virtual CYExpression *PrefixExpression(apr_pool_t *pool, CYExpression *rhs) const;' | |
60 | if infix != None: | |
61 | print ' virtual CYExpression *InfixExpression(apr_pool_t *pool, CYExpression *lhs, CYExpression *rhs) const;' | |
62 | if postfix != None: | |
63 | print ' virtual CYExpression *PostfixExpression(apr_pool_t *pool, CYExpression *lhs) const;' | |
64 | if assign != None: | |
65 | print ' virtual CYExpression *AssignmentExpression(apr_pool_t *pool, CYExpression *lhs, CYExpression *rhs) const;' | |
66 | print '};' | |
67 | ||
68 | if prefix != None: | |
69 | express(prefix, 'Prefix', 'CYExpression *rhs', 'rhs') | |
70 | if infix != None: | |
71 | express(infix, 'Infix', 'CYExpression *lhs, CYExpression *rhs', 'lhs, rhs') | |
72 | if postfix != None: | |
73 | express(postfix, 'Postfix', 'CYExpression *lhs', 'lhs') | |
74 | if assign != None: | |
75 | express('Assign' + assign, 'Assignment', 'CYExpression *lhs, CYExpression *rhs', 'lhs, rhs') | |
76 | ||
77 | for line in lines: | |
78 | line = line.split() | |
79 | name, text, word, prefix, assign, infix, precedence, postfix = data(line) | |
80 | ||
81 | if prefix != None: | |
82 | print 'CYExpression *CYToken%(name)s::PrefixExpression(apr_pool_t *pool, CYExpression *rhs) const {' % locals() | |
83 | print ' return new(pool) CYExpression%(prefix)s(rhs);' % locals() | |
84 | print '}' | |
85 | ||
86 | if infix != None: | |
87 | print 'CYExpression *CYToken%(name)s::InfixExpression(apr_pool_t *pool, CYExpression *lhs, CYExpression *rhs) const {' % locals() | |
88 | print ' return new(pool) CYExpression%(infix)s(lhs, rhs);' % locals() | |
89 | print '}' | |
90 | ||
91 | if postfix != None: | |
92 | print 'CYExpression *CYToken%(name)s::PostfixExpression(apr_pool_t *pool, CYExpression *rhs) const {' % locals() | |
93 | print ' return new(pool) CYExpression%(postfix)s(rhs);' % locals() | |
94 | print '}' | |
95 | ||
96 | if assign != None: | |
97 | print 'CYExpression *CYToken%(name)s::AssignmentExpression(apr_pool_t *pool, CYExpression *lhs, CYExpression *rhs) const {' % locals() | |
98 | print ' return new(pool) CYExpressionAssign%(assign)s(lhs, rhs);' % locals() | |
99 | print '}' | |
100 |