From 56d51b835cf17a31f3d7d5e70980c90b4370f75a Mon Sep 17 00:00:00 2001 From: Sei Lisa Date: Mon, 28 Jul 2014 19:20:36 +0200 Subject: [PATCH] Hack to make identifiers in globals in non-global-expression mode work. --- lslopt/lsloutput.py | 9 ++++++--- lslopt/lslparse.py | 24 ++++++++++++++++++++---- testparser.py | 13 +++++++++++++ 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/lslopt/lsloutput.py b/lslopt/lsloutput.py index e794987..55824ce 100644 --- a/lslopt/lsloutput.py +++ b/lslopt/lsloutput.py @@ -80,10 +80,10 @@ class outscript(object): return '[]' if len(value) < 5: self.listmode = True - ret = '[ ' + self.Value2LSL(value[0]) + ret = '[' + self.Value2LSL(value[0]) for elem in value[1:]: ret += ', ' + self.Value2LSL(elem) - ret += ' ]' + ret += ']' self.listmode = False return ret ret = '\n' @@ -100,6 +100,9 @@ class outscript(object): first = False self.indentlevel -= 1 return ret + self.dent() + self.indent + ']' + + if tvalue == tuple and value[0] == 'IDENT': # HACK + return value[2] assert False, u'Value of unknown type in Value2LSL: ' + repr(value) def dent(self): @@ -180,7 +183,7 @@ class outscript(object): op = self.OutExpr(expr[2]) return op + ' = ' + op + ' ' + node[:-1] + ' (' + self.OutExpr(expr[3]) + ')' - raise Exception('Internal error: expression type "' + node + '" not handled') # pragma: no cover + assert False, 'Internal error: expression type "' + node + '" not handled' # pragma: no cover def OutCode(self, code): #return self.dent() + '{\n' + self.dent() + '}\n' diff --git a/lslopt/lslparse.py b/lslopt/lslparse.py index a66b71e..4b5d0db 100644 --- a/lslopt/lslparse.py +++ b/lslopt/lslparse.py @@ -1347,22 +1347,38 @@ class parser(object): return (S['IDENT'], S[tmp[1]], tok[1], self.FindScopeIndex(tok[1])) if tok[0] == '<': value = [self.Parse_simple_expr()] - self.autocastcheck((0, self.PythonType2LSL[type(value[0])]), 'float') + if type(value[0]) == tuple: + typnode = value[0] + else: + typnode = (0, self.PythonType2LSL[type(value[0])]) + self.autocastcheck(typnode, 'float') self.expect(',') self.NextToken() value.append(self.Parse_simple_expr()) - self.autocastcheck((0, self.PythonType2LSL[type(value[1])]), 'float') + if type(value[1]) == tuple: + typnode = value[1] + else: + typnode = (0, self.PythonType2LSL[type(value[1])]) + self.autocastcheck(typnode, 'float') self.expect(',') self.NextToken() value.append(self.Parse_simple_expr()) - self.autocastcheck((0, self.PythonType2LSL[type(value[2])]), 'float') + if type(value[2]) == tuple: + typnode = value[2] + else: + typnode = (0, self.PythonType2LSL[type(value[2])]) + self.autocastcheck(typnode, 'float') if self.tok[0] == '>': self.NextToken() return Vector(value) self.expect(',') self.NextToken() value.append(self.Parse_simple_expr()) - self.autocastcheck((0, self.PythonType2LSL[type(value[3])]), 'float') + if type(value[3]) == tuple: + typnode = value[3] + else: + typnode = (0, self.PythonType2LSL[type(value[3])]) + self.autocastcheck(typnode, 'float') self.expect('>') self.NextToken() return Quaternion(value) diff --git a/testparser.py b/testparser.py index 638c275..e4b0e2f 100644 --- a/testparser.py +++ b/testparser.py @@ -278,6 +278,19 @@ class Test03_Optimizer(UnitTestCase): ''', ['extendedassignment']) self.opt.optimize(p, self.parser.functions) self.outscript.output(p) + p = self.parser.parse(''' + key k = "blah"; + list L = [k, "xxxx", 1.0]; + float f; + vector v = ; + + default{timer(){}} + ''', ['extendedassignment']) + self.opt.optimize(p, self.parser.functions) + out = self.outscript.output(p) + self.assertEqual(out, 'key k = "blah";\nlist L = [k, "xxxx", 1.];\n' + 'float f;\nvector v = ;\ndefault\n{\n timer()\n' + ' {\n }\n}\n') def tearDown(self): del self.parser