#######################################################################
-ID, NUMBER, HEXNUM, STRING, WILDCARD, PRAGMA, LPAREN, RPAREN, LCURLY, RCURLY, COMMA, AMP, EQUAL, PLUS, VERT, BLOB = xrange(16)
+ID, NUMBER, HEXNUM, STRING, WILDCARD, LPAREN, RPAREN, LCURLY, RCURLY, COMMA, AMP, EQUAL, PLUS, VERT, BLOB = xrange(15)
class CallScanner(Scanner):
# whitespace
(SKIP, r'[ \t\f\r\n\v]+', False),
+ # comments
+ (SKIP, r'//[^\r\n]*', False),
+
# Alphanumeric IDs
(ID, r'[a-zA-Z_][a-zA-Z0-9_]*(?:::[a-zA-Z_][a-zA-Z0-9_]*)?', True),
# Wildcard
(WILDCARD, r'<[^>]*>', False),
-
- # Pragma
- (PRAGMA, r'#[^\r\n]*', False),
]
# symbol table
def parse(self):
while not self.eof():
- self.parse_element()
- return TraceMatcher(self.calls)
-
- def parse_element(self):
- if self.lookahead.type == PRAGMA:
- token = self.consume()
- self.handlePragma(token.text)
- else:
self.parse_call()
+ return TraceMatcher(self.calls)
def parse_call(self):
if self.lookahead.type == NUMBER:
def parse_opt_pair(self):
'''Parse an optional `name = value` pair.'''
if self.match(ID):
- name = self.consume(ID).text
+ token = self.consume(ID)
if self.match(EQUAL):
self.consume(EQUAL)
+ name = token.text
value = self.parse_value()
else:
- value = name
name = None
+ value = self.handleID(token.text)
else:
name = None
value = self.parse_value()
return self.handleString(value)
elif self.match(NUMBER):
token = self.consume()
- if '.' in token.text:
+ try:
+ value = int(token.text)
+ except ValueError:
value = float(token.text)
return self.handleFloat(value)
else:
- value = int(token.text)
return self.handleInt(value)
elif self.match(HEXNUM):
token = self.consume()
def handleCall(self, callNo, functionName, args, ret):
raise NotImplementedError
- def handlePragma(self, line):
- raise NotImplementedError
-
class RefTraceParser(TraceParser):
- def __init__(self, stream):
- TraceParser.__init__(self, stream)
+ def __init__(self, fileName):
+ TraceParser.__init__(self, open(fileName, 'rt'))
self.calls = []
def parse(self):
def handleCall(self, callNo, functionName, args, ret):
call = CallMatcher(callNo, functionName, args, ret)
self.calls.append(call)
-
- def handlePragma(self, line):
- pass
class SrcTraceParser(TraceParser):
refFileName, srcFileName = args
- refStream = open(refFileName, 'rt')
- refParser = RefTraceParser(refStream)
+ refParser = RefTraceParser(refFileName)
refTrace = refParser.parse()
if options.verbose:
sys.stdout.write('// Reference\n')
sys.stdout.write('\n')
if srcFileName.endswith('.trace'):
- cmd = [options.apitrace, 'dump', '--color=never', srcFileName]
- p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
+ cmd = [options.apitrace, 'dump', '--verbose', '--color=never', srcFileName]
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)
srcStream = p.stdout
else:
srcStream = open(srcFileName, 'rt')