Spaces:
Build error
Build error
""" | |
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) | |