Skip to content
This repository was archived by the owner on Dec 10, 2018. It is now read-only.

Commit 9e0f178

Browse files
committed
Merge pull request #30 from suzaku/faster_parsing
Faster parse
2 parents 51f7114 + 1bbce7a commit 9e0f178

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,4 @@ pip-log.txt
3939
.project
4040
.pydevproject
4141
*.sublime-workspace
42+
*.sw[op]

thriftpy/parser.py

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ def parse(schema):
3131
"__version__": __version__,
3232
"__python__": __python__[:2],
3333
"__hash__": hashlib.md5(schema.encode('utf-8')).digest(),
34+
"typedefs": {},
35+
"consts": {},
36+
"enums": {},
37+
"structs": [],
38+
"exceptions": [],
39+
"services": [],
3440
}
3541

3642
# constants
@@ -69,18 +75,15 @@ def parse(schema):
6975

7076
# typedef parser
7177
typedef = _typedef + orig_types("ttype") + identifier("name")
72-
result["typedefs"] = dict((t.name, t.ttype) for t, _, _ in typedef.scanString(schema))
7378

7479
# const parser
7580
const = _const + ttype("ttype") + identifier("name") + EQ + value("value")
76-
result["consts"] = dict((c.name, c.value) for c, _, _ in const.scanString(schema))
7781

7882
# enum parser
7983
enum_value = pa.Group(identifier('name') + pa.Optional(EQ + integer_('value')) + pa.Optional(COMMA))
8084
enum_list = pa.Group(pa.ZeroOrMore(enum_value))("members")
8185
enum = _enum + identifier("name") + LBRACE + enum_list + RBRACE
8286
enum.ignore(single_line_comment)
83-
result["enums"] = dict((e.name, e) for e, _, _ in enum.scanString(schema))
8487

8588
# struct parser
8689
category = _or(*map(pa.Literal, ("required", "optional")))
@@ -89,12 +92,10 @@ def parse(schema):
8992
struct = _or(_struct, _union) + identifier("name") + LBRACE + struct_members + RBRACE
9093
struct.ignore(single_line_comment)
9194
# struct defines is ordered
92-
result["structs"] = [s for s, _, _ in struct.scanString(schema)]
9395

9496
# exception parser
9597
exception = _exception + identifier("name") + LBRACE + struct_members + RBRACE
9698
exception.ignore(single_line_comment)
97-
result["exceptions"] = [s for s, _, _ in exception.scanString(schema)]
9899

99100
# service parser
100101
ftype = _or(ttype, pa.Keyword("void"))
@@ -105,7 +106,29 @@ def parse(schema):
105106
service = _service + identifier("name") + LBRACE + service_apis + RBRACE
106107
service.ignore(single_line_comment)
107108
service.ignore(pa.cStyleComment)
108-
result["services"] = [s for s, _, _ in service.scanString(schema)]
109+
110+
parser = pa.OneOrMore(
111+
_or(
112+
pa.Group(typedef)('typedefs*'), pa.Group(const)('consts*'),
113+
pa.Group(enum)('enums*'), pa.Group(struct)('structs*'),
114+
pa.Group(exception)('exceptions*'), pa.Group(service)('services')
115+
)
116+
)
117+
118+
for parse_results, _, _ in parser.scanString(schema):
119+
for res in parse_results:
120+
if res.getName() == 'typedefs':
121+
result[res.getName()][res.name] = res.ttype
122+
elif res.getName() == 'consts':
123+
result[res.getName()][res.name] = res.value
124+
elif res.getName() == 'enums':
125+
result[res.getName()][res.name] = res
126+
elif res.getName() == 'structs':
127+
result[res.getName()].append(res)
128+
elif res.getName() == 'exceptions':
129+
result[res.getName()].append(res)
130+
elif res.getName() == 'services':
131+
result[res.getName()].append(res)
109132

110133
return result
111134

0 commit comments

Comments
 (0)