12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- """
- This module deals with interpreting the parse tree as Python
- would have done, in the compiler.
- For now this only covers parse tree to value conversion of
- compile-time values.
- """
- from __future__ import absolute_import
- from .Nodes import *
- from .ExprNodes import *
- from .Errors import CompileError
- class EmptyScope(object):
- def lookup(self, name):
- return None
- empty_scope = EmptyScope()
- def interpret_compiletime_options(optlist, optdict, type_env=None, type_args=()):
- """
- Tries to interpret a list of compile time option nodes.
- The result will be a tuple (optlist, optdict) but where
- all expression nodes have been interpreted. The result is
- in the form of tuples (value, pos).
- optlist is a list of nodes, while optdict is a DictNode (the
- result optdict is a dict)
- If type_env is set, all type nodes will be analysed and the resulting
- type set. Otherwise only interpretateable ExprNodes
- are allowed, other nodes raises errors.
- A CompileError will be raised if there are problems.
- """
- def interpret(node, ix):
- if ix in type_args:
- if type_env:
- type = node.analyse_as_type(type_env)
- if not type:
- raise CompileError(node.pos, "Invalid type.")
- return (type, node.pos)
- else:
- raise CompileError(node.pos, "Type not allowed here.")
- else:
- if (sys.version_info[0] >=3 and
- isinstance(node, StringNode) and
- node.unicode_value is not None):
- return (node.unicode_value, node.pos)
- return (node.compile_time_value(empty_scope), node.pos)
- if optlist:
- optlist = [interpret(x, ix) for ix, x in enumerate(optlist)]
- if optdict:
- assert isinstance(optdict, DictNode)
- new_optdict = {}
- for item in optdict.key_value_pairs:
- new_key, dummy = interpret(item.key, None)
- new_optdict[new_key] = interpret(item.value, item.key.value)
- optdict = new_optdict
- return (optlist, new_optdict)
|