Fixed a bug in the lexer

This commit is contained in:
nocturn9x 2020-08-19 21:45:51 +02:00
parent 9552a1f04f
commit b58ea99aed
3 changed files with 19 additions and 13 deletions

View File

@ -575,6 +575,19 @@ proc forStatement(self: Compiler) =
self.loopType = NONE
proc parseBreak(self: Compiler) =
if self.loopType == NONE:
self.parser.parseError(self.parser.previous, "'break' outside loop")
else:
self.parser.consume(SEMICOLON, "missing semicolon after statement")
var jmp = self.emitJump(OP_JUMP)
if self.parser.peek.kind != EOF:
self.declaration()
self.emitByte(OP_POP)
else:
self.emitByte(OP_RETURN)
self.patchJump(jmp)
proc parseAnd(self: Compiler, canAssign: bool) =
var jump = self.emitJump(OP_JUMP_IF_FALSE)
@ -592,17 +605,6 @@ proc parseOr(self: Compiler, canAssign: bool) =
self.patchJump(endJump)
proc parseBreak(self: Compiler) =
if self.loopType == NONE:
self.parser.parseError(self.parser.previous, "'break' outside loop")
else:
self.parser.consume(SEMICOLON, "missing semicolon after statement")
var jmp = self.emitJump(OP_JUMP)
self.emitByte(OP_POP)
# self.declaration()
self.patchJump(jmp)
proc statement(self: Compiler) =
if self.parser.match(VAR):
self.varDeclaration()

View File

@ -150,7 +150,7 @@ proc scanToken(self: var Lexer) =
if single in [' ', '\t', '\r']:
return
elif single == '\n':
self.current = self.current + 1
self.line += 1
elif single in ['"', '\'']:
self.parseString(single)
elif single.isDigit():

View File

@ -379,7 +379,11 @@ proc interpret*(self: var VM, source: string, debug: bool = false, repl: bool =
self.chunk = chunk
self.ip = 0
if len(chunk.code) > 1:
result = self.run(debug, repl)
try:
result = self.run(debug, repl)
except KeyboardInterrupt:
self.error(newInterruptedError(""))
return RUNTIME_ERROR
chunk.freeChunk()
self.freeVM()