Beispiel #1
0
    def extension(self, node):
        ret = {}
        seen = set()

        def _ensure_unique(field):
            if field in seen:
                raise ValueError(
                    "Field %r for extension %r is specified more than once !" %
                    (field, ret["name"]))
            else:
                seen.add(field)

        def update(extension_dict, c):
            if type(c) == list:
                for i in c:
                    update(extension_dict, i)
            elif c.type == "name":
                ret["name"] = c.value
            elif c.type == "sources":
                _ensure_unique("sources")
                ret["sources"] = c.value
            elif c.type == "include_dirs":
                _ensure_unique("include_dirs")
                ret["include_dirs"] = c.value
            else:
                raise ValueError("Gne ?")

        for c in [node.children[0]] + node.children[1]:
            update(ret, c)
        return Node("extension", value=ret)
Beispiel #2
0
    def path(self, node):
        path = {}

        def update(c):
            if type(c) == list:
                for i in c:
                    update(i)
            elif c.type == "path_declaration":
                path["name"] = c.value
            elif c.type == "path_description":
                path["description"] = c.value
            elif c.type == "default":
                path["default"] = c.value
            else:
                raise SyntaxError("GNe ?")

        if len(node.children) > 1:
            nodes = [node.children[0]] + node.children[1]
        else:
            nodes = [node.children[0]]
        for node in nodes:
            update(node)

        if not "description" in path:
            raise ValueError("missing description in path section %r" %
                             (path["name"], ))
        if not "default" in path:
            raise ValueError("missing default in path section %r" %
                             (path["name"], ))
        return Node("path", value=path)
Beispiel #3
0
    def compiled_library(self, node):
        ret = {"sources": [], "include_dirs": []}
        seen = set()

        def _ensure_unique(field):
            if field in seen:
                raise ValueError(
                    "Field %r for compiled library %r is specified more than once !"
                    % (field, ret["name"]))
            else:
                seen.add(field)

        def update(compiled_library_dict, c):
            if c.type == "name":
                ret["name"] = c.value
            elif c.type == "sources":
                _ensure_unique("sources")
                ret["sources"] = c.value
            elif c.type == "include_dirs":
                _ensure_unique("include_dirs")
                ret["include_dirs"] = c.value
            else:
                raise ValueError("Unknown node %s" % c)

        for c in [node.children[0]] + node.children[1]:
            update(ret, c)
        return Node("compiled_library", value=ret)
Beispiel #4
0
def p_library_name(p):
    """library_name : word
                    |"""
    if len(p) == 1:
        name = "default"
    else:
        name = p[1]
    p[0] = Node("library_name", value=name)
Beispiel #5
0
    def description(self, node):
        tokens = []
        for i in node.value:
            if i.type in [
                    "literal", "multi_literal", "newline", "indent", "dedent",
                    "single_line"
            ]:
                tokens.append(i)

        # FIXME: fix grammar to get ind_shift
        ind_shift = 4
        inds = [0]
        line_str = []
        for line in split_newlines(tokens):
            # FIXME: this is horrible
            if line[0].type == "dedent":
                if set([node.type for node in line
                        ]) == set(["dedent"
                                   ]):  # if the line only contains dedent
                    inds.pop(0)
                    remain = [Node("literal", value="\n")]
                else:
                    while line[0].type == "dedent":
                        inds.pop(0)
                        line = line[1:]
                    remain = line
            elif line[0].type == "indent":
                inds.insert(0, line[0].value - ind_shift)
                remain = line[1:]
            else:
                remain = line

            if len(remain) > 0:
                if remain[-1].type == "dedent":
                    remain = remain[:-1]

            cur_line = [" " * inds[0]]
            cur_line.extend([t.value for t in remain])
            line_str.append("".join(cur_line))

        return Node("description", value="".join(line_str))
Beispiel #6
0
def p_anytoken_no_comma(p):
    """anytoken_no_comma : WORD
                         | COLON
                         | DOUBLE_COLON
                         | LPAR
                         | RPAR
                         | LESS
                         | SLASH
                         | SHARP
                         | EQUAL
                         | GREATER
    """
    p[0] = Node("anytoken", value=p[1])
Beispiel #7
0
    def flag(self, node):
        flag = {}
        for i in [node.children[0]] + node.children[1]:
            if i.type == "flag_declaration":
                flag["name"] = i.value
            elif i.type == "flag_description":
                flag["description"] = i.value
            elif i.type == "default":
                flag["default"] = i.value
            else:
                raise SyntaxError("GNe ?")

        if not flag["default"] in ["true", "false"]:
            raise SyntaxError("invalid default value %s for flag %s" \
                              % (flag["default"], flag["name"]))

        if not flag["name"] in self._vars:
            self._vars[flag["name"]] = flag["default"]

        return Node("flag", value=flag)
Beispiel #8
0
    def executable(self, node):
        d = {}

        def update(exec_d, c):
            if type(c) == list:
                for i in c:
                    update(exec_d, i)
            elif c.type == "name":
                exec_d["name"] = c.value
            elif c.type == "module":
                exec_d["module"] = c.value
            elif c.type == "function":
                exec_d["function"] = c.value
            else:
                raise ValueError("Unhandled node type: %s" % c)

        for c in node.children:
            update(d, c)

        return Node("executable", value=d)
Beispiel #9
0
    def library(self, node):
        library = {
            "py_modules": [],
            "install_requires": [],
            "build_requires": [],
            "packages": [],
            "extensions": {},
            "compiled_libraries": {},
            "sub_directory": None,
        }

        def update(library_dict, c):
            if type(c) == list:
                for i in c:
                    update(library_dict, i)
            elif c.type == "name":
                library_dict["name"] = c.value
            elif c.type == "modules":
                library_dict["py_modules"].extend(c.value)
            elif c.type == "packages":
                library_dict["packages"].extend(c.value)
            elif c.type in ("build_requires", "install_requires"):
                library_dict[c.type].extend(c.value)
            elif c.type == "extension":
                name = c.value["name"]
                library_dict["extensions"][name] = c.value
            elif c.type == "compiled_library":
                name = c.value["name"]
                library_dict["compiled_libraries"][name] = c.value
            elif c.type == "sub_directory":
                library_dict["sub_directory"] = c.value
            else:
                raise ValueError("Unhandled node type: %s" % c)

        if len(node.children) > 1:
            nodes = [node.children[0]] + node.children[1]
        else:
            nodes = [node.children[0]]
        for c in nodes:
            update(library, c)
        return Node("library", value=library)
Beispiel #10
0
    def data_files(self, node):
        d = {}

        def update(data_d, c):
            if type(c) == list:
                for i in c:
                    update(data_d, i)
            elif c.type == "data_files_declaration":
                d["name"] = c.value
            elif c.type == "source_dir":
                d["source_dir"] = c.value
            elif c.type == "target_dir":
                d["target_dir"] = c.value
            elif c.type == "files":
                d["files"] = c.value
            else:
                raise ValueError("Unhandled node type: %s" % c)

        for c in node.children:
            update(d, c)

        return Node("data_files", value=d)
Beispiel #11
0
def p_literal_no_space(p):
    """literal_no_space : anytoken_no_comma
    """
    p[0] = Node("literal", value=p[1].value)
Beispiel #12
0
 def path_default(self, node):
     return Node("default", value=node.value)
Beispiel #13
0
def p_literal_no_space_term(p):
    """literal_no_space : COMMA
    """
    p[0] = Node("literal", value=p[1])
Beispiel #14
0
 def use_backends(self, node):
     return Node("use_backends", value=node.value)
Beispiel #15
0
 def sub_directory(self, node):
     return Node("sub_directory", value=node.value)
Beispiel #16
0
def p_dedent(p):
    """dedent : DEDENT
    """
    p[0] = Node("dedent", value=p[1])
Beispiel #17
0
 def parse(self, data):
     res = self.parser.parse(data, lexer=self.lexer)
     # FIXME: this is stupid, deal correctly with empty ast in the grammar proper
     if res is None:
         res = Node("empty")
     return res
Beispiel #18
0
 def extension_declaration(self, node):
     return Node("name", value=node.value)
Beispiel #19
0
def p_literal_term(p):
    """literal : WS
    """
    p[0] = Node("literal", value=p[1])
Beispiel #20
0
def p_multi_literal(p):
    """multi_literal : literal
    """
    p[0] = Node("multi_literal", value=p[1].value)
Beispiel #21
0
 def function(self, node):
     return Node("function", value=node.value)
Beispiel #22
0
 def summary(self, node):
     ret = Node(node.type)
     ret.value = "".join([i.value for i in node.value])
     return ret
Beispiel #23
0
def p_version(p):
    """version : WORD"""
    p[0] = Node("version", value=p[1])
Beispiel #24
0
def p_word(p):
    """word : WORD"""
    p[0] = Node("word", value=p[1])
Beispiel #25
0
 def flag_default(self, node):
     return Node("default", value=node.value)
Beispiel #26
0
def p_literal(p):
    """literal : literal_no_space
    """
    p[0] = Node("literal", value=p[1].value)
Beispiel #27
0
 def compiled_library_declaration(self, node):
     return Node("name", value=node.value)
Beispiel #28
0
 def exec_name(self, node):
     return Node("name", value=node.value)
Beispiel #29
0
def p_indent(p):
    """indent : INDENT
    """
    p[0] = Node("indent", value=p[1])
Beispiel #30
0
 def module(self, node):
     return Node("module", value=node.value)
Beispiel #31
0
 def library_name(self, node):
     return Node("name", value=node.value)