lexer: fix EOF error when feeding partial input to the lexer.
This commit is contained in:
parent
9921d9fccd
commit
c2751847d8
1 changed files with 14 additions and 10 deletions
|
|
@ -62,8 +62,9 @@ class Tokens(enum.Enum):
|
||||||
|
|
||||||
|
|
||||||
class Lexer(collections.abc.Iterator):
|
class Lexer(collections.abc.Iterator):
|
||||||
def __init__(self, data: str, token_filter: typing.Callable[[Token], bool] | None = None):
|
def __init__(self, input_stream: typing.TextIO, token_filter: typing.Callable[[Token], bool] | None = None):
|
||||||
self.data = data
|
self.input = input_stream
|
||||||
|
self.data: str = ""
|
||||||
self.tokens = []
|
self.tokens = []
|
||||||
self.length: int | None = None
|
self.length: int | None = None
|
||||||
self.begin: int = 0
|
self.begin: int = 0
|
||||||
|
|
@ -96,7 +97,17 @@ class Lexer(collections.abc.Iterator):
|
||||||
self.tokens.append(tok)
|
self.tokens.append(tok)
|
||||||
return tok
|
return tok
|
||||||
|
|
||||||
if self.begin < len(self.data):
|
if self.tokens[-1].kind in [Tokens.BEGIN, Tokens.Newline]:
|
||||||
|
self.data += self.input.readline()
|
||||||
|
|
||||||
|
if self.begin == len(self.data):
|
||||||
|
eof_token = Token(Tokens.EOF, value=None, loc=SourceLocation(
|
||||||
|
Location(line=self.line, character=0),
|
||||||
|
))
|
||||||
|
self.tokens += [eof_token]
|
||||||
|
self.length = len(self.tokens)
|
||||||
|
return eof_token
|
||||||
|
elif self.begin < len(self.data):
|
||||||
best_result: Token = Token(Tokens.Unknown,
|
best_result: Token = Token(Tokens.Unknown,
|
||||||
loc=SourceLocation(
|
loc=SourceLocation(
|
||||||
Location(line=self.line, character=self.character),
|
Location(line=self.line, character=self.character),
|
||||||
|
|
@ -139,12 +150,5 @@ class Lexer(collections.abc.Iterator):
|
||||||
|
|
||||||
self.tokens += [best_result]
|
self.tokens += [best_result]
|
||||||
return best_result
|
return best_result
|
||||||
elif self.begin == len(self.data):
|
|
||||||
eof_token = Token(Tokens.EOF, value=None, loc=SourceLocation(
|
|
||||||
Location(line=self.line, character=0), source=self.data
|
|
||||||
))
|
|
||||||
self.tokens += [eof_token]
|
|
||||||
self.length = len(self.tokens)
|
|
||||||
return eof_token
|
|
||||||
else:
|
else:
|
||||||
raise IndexError("EOF already reached")
|
raise IndexError("EOF already reached")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue