class Parser:
- token_re = re.compile(r'(\w+|\s+|.)')
+ token_re = re.compile(r'(\d[x0-9a-fA-F.UL]*|\w+|\s+|.)')
multi_comment_re = re.compile(r'/\*.*?\*/', flags = re.DOTALL)
single_comment_re = re.compile(r'//.*',)
def parse_declaration(self):
self.parse_tags()
- if self.match('enum'):
+ if self.match('#'):
+ self.parse_define()
+ elif self.match('enum'):
self.parse_enum()
elif self.match('interface'):
self.parse_interface()
print '%s = %s(%s, [' % (name, constructor, type)
while self.lookahead() != '}':
- self.consume('#')
- self.consume('define')
- name = self.consume()
- value = self.consume()
- #print ' "%s",\t# %s' % (name, value)
- print ' "%s",' % (name,)
+ name, value = self.parse_define()
self.consume('}')
print '])'
print
+ def parse_define(self):
+ self.consume('#')
+ self.consume('define')
+ name = self.consume()
+ value = self.consume()
+ #print ' "%s",\t# %s' % (name, value)
+ print ' "%s",' % (name,)
+ return name, value
+
def parse_struct(self):
self.consume('struct')
name = self.consume()
value = 0
while self.lookahead() != '}':
type, name = self.parse_named_type()
+
+ if self.match(':'):
+ self.consume()
+ self.consume()
+
if self.match(','):
self.consume(',')
self.consume(';')
if self.match(';'):
return
self.consume(':')
+ if self.lookahead() in ('public', 'protected'):
+ self.consume()
base = self.consume()
self.consume('{')
ret = self.parse_type()
- if self.match('__stdcall'):
+ if self.match('__stdcall', 'WINAPI'):
self.consume()
creator = 'StdFunction'
args.append(arg)
if self.match(','):
self.consume()
- self.consume() == ')'
+ self.consume(')')
+ if self.lookahead() == 'const':
+ self.consume()
+ extra = ', const=True' + extra
print ' %s(%s, "%s", [%s]%s),' % (creator, ret, name, ', '.join(args), extra)
arg = '(%s, "%s")' % (type, name)
if 'out' in tags:
arg = 'Out' + arg
+
+ if self.match('='):
+ self.consume()
+ while not self.match(',', ')'):
+ self.consume()
+
return arg
def parse_tags(self):