Create a python version of QF's script parser.

It's error handling is bogus, but it works for good input :)
This commit is contained in:
Bill Currie 2012-08-29 14:55:11 +09:00
parent d6a1daaf30
commit 08d7131c1b

72
tools/io_qfmap/script.py Normal file
View file

@ -0,0 +1,72 @@
# vim:ts=4:et
class Script:
def __init__(self, filename, text, single="{}()':"):
self.filename = filename
self.text = text
self.single = single
self.pos = 0
self.line = 1
self.unget = False
def tokenAvailable(self, crossline=False):
if self.unget:
return True
while self.pos < len(self.text):
while self.text[self.pos].isspace():
if self.text[self.pos] == "\n":
if not crossline:
return False
self.line += 1
self.pos += 1
if self.pos == len(self.text):
return False
if self.text[self.pos] in ["\x1a", "\x04"]:
# end of file characters
self.pos += 1
continue
if self.text[self.pos:self.pos + 2] == "//":
while (self.pos < len(self.text)
and self.text[self.pos] != "\n"):
self.pos += 1
if self.pos == len(self.text):
return False
if not crossline:
return False
continue
return True
return False
def getToken(self, crossline=False):
if self.unget:
self.unget = False
return self.token
if not self.tokenAvailable(crossline):
if not crossline:
self.error("line is incomplete")
return None
if self.text[self.pos] == "\"":
self.pos += 1
start = self.pos
if self.text[self.pos] == len(self.text):
self.error("EOF inside quoted string")
while self.text[self.pos] != "\"":
if self.pos == len(self.text):
self.error("EOF inside quoted string")
return None
if self.text[self.pos] == "\n":
self.line += 1
self.pos += 1
self.token = self.text[start:self.pos]
self.pos += 1
else:
start = self.pos
if self.text[self.pos] in self.single:
self.pos += 1
else:
while (self.pos < len(self.text)
and not self.text[self.pos].isspace()
and self.text[self.pos] not in self.single):
self.pos += 1
self.token = self.text[start:self.pos]
return self.token
def ungetToken(self):
self.unget = True