/
first.py
84 lines (75 loc) · 3.03 KB
/
first.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
global_vars = {}
def lookup(map, name):
for x,v in map:
if x==name: return v
return global_vars[name]
# Begin -- grammar generated by Yapps
import sys, re
from yapps import runtime
class TestScanner(runtime.Scanner):
patterns = [
('"##.+"', re.compile('##.+')),
('[ \n\t]', re.compile('[ \n\t]')),
('OB', re.compile('{')),
('CB', re.compile('}')),
('name', re.compile('[^\n\t \\{\\}\x00]+')),
('key', re.compile('[^\n\t \\{\\}]+')),
('value', re.compile('[^\n\t\\{\\}]+')),
('eof', re.compile('\x00')),
('sp', re.compile('[ ]')),
]
def __init__(self, str,*args,**kw):
runtime.Scanner.__init__(self,None,{'[ \n\t]':None,},str,*args,**kw)
class Test(runtime.Parser):
Context = runtime.Context
def blocks(self, _parent=None):
_context = self.Context(_parent, self._scanner, 'blocks', [])
while self._peek('eof', 'name', '"##.+"', context=_context) != 'eof':
_token = self._peek('name', '"##.+"', context=_context)
if _token == 'name':
block = self.block({}, _context)
else: # == '"##.+"'
comment = self.comment(_context)
eof = self._scan('eof', context=_context)
return global_vars
def block(self, D, _parent=None):
_context = self.Context(_parent, self._scanner, 'block', [D])
name = self._scan('name', context=_context)
OB = self._scan('OB', context=_context)
while self._peek('CB', 'key', context=_context) == 'key':
key = self._scan('key', context=_context)
key = key
_token = self._peek('OB', 'value', context=_context)
if _token == 'OB':
OB = self._scan('OB', context=_context)
subblock = self.subblock({}, _context)
CB = self._scan('CB', context=_context)
D[key] = subblock
else: # == 'value'
value = self._scan('value', context=_context)
D[key] = value.lstrip()
CB = self._scan('CB', context=_context)
global_vars[name] = D;#print i
def subblock(self, V, _parent=None):
_context = self.Context(_parent, self._scanner, 'subblock', [V])
while self._peek('name', 'CB', context=_context) == 'name':
name = self._scan('name', context=_context)
value = self._scan('value', context=_context)
V[name] = value.lstrip()
return (V)
def comment(self, _parent=None):
_context = self.Context(_parent, self._scanner, 'comment', [])
self._scan('"##.+"', context=_context)
def parse(rule, text):
P = Test(TestScanner(text))
return runtime.wrap_error_reporter(P, rule)
if __name__ == '__main__':
from sys import argv, stdin
if len(argv) >= 2:
if len(argv) >= 3:
f = open(argv[2],'r')
else:
f = stdin
print parse(argv[1], f.read())
else: print >>sys.stderr, 'Args: <rule> [<filename>]'
# End -- grammar generated by Yapps