[jsinterp] Added try parser (test needed)
This commit is contained in:
parent
48aaa4178e
commit
dedb6eea79
@ -272,8 +272,39 @@ class JSInterpreter(object):
|
|||||||
raise ExtractorError('Throw statement is not yet supported at %d' % token_pos)
|
raise ExtractorError('Throw statement is not yet supported at %d' % token_pos)
|
||||||
|
|
||||||
elif token_value == 'try':
|
elif token_value == 'try':
|
||||||
# TODO parse trystatement
|
token_stream.pop()
|
||||||
raise ExtractorError('Try statement is not yet supported at %d' % token_pos)
|
token_id, token_value, token_pos = token_stream.peek()
|
||||||
|
if token_id is not Token.COPEN:
|
||||||
|
raise ExtractorError('Block is expected at %d' % token_pos)
|
||||||
|
try_block = self._next_statement(token_stream, stack_top - 1)
|
||||||
|
token_id, token_value, token_pos = token_stream.pop()
|
||||||
|
catch_block = None
|
||||||
|
if token_id is Token.ID and token_value == 'catch':
|
||||||
|
token_id, token_value, token_pos = token_stream.peek()
|
||||||
|
if token_id is not Token.POPEN:
|
||||||
|
raise ExtractorError('Catch clause is missing an identifier at %d' % token_pos)
|
||||||
|
token_stream.pop()
|
||||||
|
token_stream.chk_id()
|
||||||
|
token_id, error_name, token_pos = token_stream.pop()
|
||||||
|
token_id, token_value, token_pos = token_stream.pop()
|
||||||
|
if token_id is not Token.PCLOSE:
|
||||||
|
raise ExtractorError('Catch clause expects a single identifier at %d' % token_pos)
|
||||||
|
token_id, token_value, token_pos = token_stream.peek()
|
||||||
|
if token_id is not Token.COPEN:
|
||||||
|
raise ExtractorError('Block is expected at %d' % token_pos)
|
||||||
|
catch_block = (error_name, self._next_statement(token_stream, stack_top - 1))
|
||||||
|
|
||||||
|
finally_block = None
|
||||||
|
if token_id is Token.ID and token_value == 'finally':
|
||||||
|
token_id, token_value, token_pos = token_stream.peek()
|
||||||
|
if token_id is not Token.COPEN:
|
||||||
|
raise ExtractorError('Block is expected at %d' % token_pos)
|
||||||
|
finally_block= self._next_statement(token_stream, stack_top - 1)
|
||||||
|
|
||||||
|
if catch_block is None and finally_block is None:
|
||||||
|
raise ExtractorError('Try statement is expecting catch or finally at %d' % token_pos)
|
||||||
|
|
||||||
|
statement = (Token.TRY, try_block, catch_block, finally_block)
|
||||||
|
|
||||||
elif token_value == 'debugger':
|
elif token_value == 'debugger':
|
||||||
# TODO parse debuggerstatement
|
# TODO parse debuggerstatement
|
||||||
@ -309,7 +340,6 @@ class JSInterpreter(object):
|
|||||||
|
|
||||||
while not ts.ended:
|
while not ts.ended:
|
||||||
yield self._next_statement(ts, stack_size)
|
yield self._next_statement(ts, stack_size)
|
||||||
# ts.pop()
|
|
||||||
raise StopIteration
|
raise StopIteration
|
||||||
|
|
||||||
def _expression(self, token_stream, stack_top):
|
def _expression(self, token_stream, stack_top):
|
||||||
@ -368,7 +398,7 @@ class JSInterpreter(object):
|
|||||||
token_stream.pop()
|
token_stream.pop()
|
||||||
peek_id, peek_value, peek_pos = token_stream.peek()
|
peek_id, peek_value, peek_pos = token_stream.peek()
|
||||||
elif peek_id is Token.POPEN:
|
elif peek_id is Token.POPEN:
|
||||||
# TODO handle field query
|
# XXX handle field query
|
||||||
raise ExtractorError('Field query is not yet supported at %d' % peek_pos)
|
raise ExtractorError('Field query is not yet supported at %d' % peek_pos)
|
||||||
|
|
||||||
if peek_id is Token.ID:
|
if peek_id is Token.ID:
|
||||||
@ -485,7 +515,7 @@ class JSInterpreter(object):
|
|||||||
token_stream.pop()
|
token_stream.pop()
|
||||||
has_another = False
|
has_another = False
|
||||||
elif peek_id is Token.ID and peek_value == 'for':
|
elif peek_id is Token.ID and peek_value == 'for':
|
||||||
# TODO parse array comprehension
|
# XXX parse array comprehension
|
||||||
raise ExtractorError('Array comprehension is not yet supported at %d' % peek_pos)
|
raise ExtractorError('Array comprehension is not yet supported at %d' % peek_pos)
|
||||||
else:
|
else:
|
||||||
elements.append(self._assign_expression(token_stream, stack_top - 1))
|
elements.append(self._assign_expression(token_stream, stack_top - 1))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user