@@ -31,6 +31,12 @@ def parse(schema):
31
31
"__version__" : __version__ ,
32
32
"__python__" : __python__ [:2 ],
33
33
"__hash__" : hashlib .md5 (schema .encode ('utf-8' )).digest (),
34
+ "typedefs" : {},
35
+ "consts" : {},
36
+ "enums" : {},
37
+ "structs" : [],
38
+ "exceptions" : [],
39
+ "services" : [],
34
40
}
35
41
36
42
# constants
@@ -69,18 +75,15 @@ def parse(schema):
69
75
70
76
# typedef parser
71
77
typedef = _typedef + orig_types ("ttype" ) + identifier ("name" )
72
- result ["typedefs" ] = dict ((t .name , t .ttype ) for t , _ , _ in typedef .scanString (schema ))
73
78
74
79
# const parser
75
80
const = _const + ttype ("ttype" ) + identifier ("name" ) + EQ + value ("value" )
76
- result ["consts" ] = dict ((c .name , c .value ) for c , _ , _ in const .scanString (schema ))
77
81
78
82
# enum parser
79
83
enum_value = pa .Group (identifier ('name' ) + pa .Optional (EQ + integer_ ('value' )) + pa .Optional (COMMA ))
80
84
enum_list = pa .Group (pa .ZeroOrMore (enum_value ))("members" )
81
85
enum = _enum + identifier ("name" ) + LBRACE + enum_list + RBRACE
82
86
enum .ignore (single_line_comment )
83
- result ["enums" ] = dict ((e .name , e ) for e , _ , _ in enum .scanString (schema ))
84
87
85
88
# struct parser
86
89
category = _or (* map (pa .Literal , ("required" , "optional" )))
@@ -89,12 +92,10 @@ def parse(schema):
89
92
struct = _or (_struct , _union ) + identifier ("name" ) + LBRACE + struct_members + RBRACE
90
93
struct .ignore (single_line_comment )
91
94
# struct defines is ordered
92
- result ["structs" ] = [s for s , _ , _ in struct .scanString (schema )]
93
95
94
96
# exception parser
95
97
exception = _exception + identifier ("name" ) + LBRACE + struct_members + RBRACE
96
98
exception .ignore (single_line_comment )
97
- result ["exceptions" ] = [s for s , _ , _ in exception .scanString (schema )]
98
99
99
100
# service parser
100
101
ftype = _or (ttype , pa .Keyword ("void" ))
@@ -105,7 +106,29 @@ def parse(schema):
105
106
service = _service + identifier ("name" ) + LBRACE + service_apis + RBRACE
106
107
service .ignore (single_line_comment )
107
108
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 )
109
132
110
133
return result
111
134
0 commit comments