def parsegen()

in common/recipes-core/fscd3/fscd/fscd_test/ply/cpp.py [0:0]


    def parsegen(self, input, source=None):

        # Replace trigraph sequences
        t = trigraph(input)
        lines = self.group_lines(t)

        if not source:
            source = ""

        self.define('__FILE__ "%s"' % source)

        self.source = source
        chunk = []
        enable = True
        iftrigger = False
        ifstack = []

        for x in lines:
            for i, tok in enumerate(x):
                if tok.type not in self.t_WS:
                    break
            if tok.value == "#":
                # Preprocessor directive

                # insert necessary whitespace instead of eaten tokens
                for tok in x:
                    if tok.type in self.t_WS and "\n" in tok.value:
                        chunk.append(tok)

                dirtokens = self.tokenstrip(x[i + 1 :])
                if dirtokens:
                    name = dirtokens[0].value
                    args = self.tokenstrip(dirtokens[1:])
                else:
                    name = ""
                    args = []

                if name == "define":
                    if enable:
                        for tok in self.expand_macros(chunk):
                            yield tok
                        chunk = []
                        self.define(args)
                elif name == "include":
                    if enable:
                        for tok in self.expand_macros(chunk):
                            yield tok
                        chunk = []
                        oldfile = self.macros["__FILE__"]
                        for tok in self.include(args):
                            yield tok
                        self.macros["__FILE__"] = oldfile
                        self.source = source
                elif name == "undef":
                    if enable:
                        for tok in self.expand_macros(chunk):
                            yield tok
                        chunk = []
                        self.undef(args)
                elif name == "ifdef":
                    ifstack.append((enable, iftrigger))
                    if enable:
                        if not args[0].value in self.macros:
                            enable = False
                            iftrigger = False
                        else:
                            iftrigger = True
                elif name == "ifndef":
                    ifstack.append((enable, iftrigger))
                    if enable:
                        if args[0].value in self.macros:
                            enable = False
                            iftrigger = False
                        else:
                            iftrigger = True
                elif name == "if":
                    ifstack.append((enable, iftrigger))
                    if enable:
                        result = self.evalexpr(args)
                        if not result:
                            enable = False
                            iftrigger = False
                        else:
                            iftrigger = True
                elif name == "elif":
                    if ifstack:
                        if ifstack[-1][
                            0
                        ]:  # We only pay attention if outer "if" allows this
                            if enable:  # If already true, we flip enable False
                                enable = False
                            elif (
                                not iftrigger
                            ):  # If False, but not triggered yet, we'll check expression
                                result = self.evalexpr(args)
                                if result:
                                    enable = True
                                    iftrigger = True
                    else:
                        self.error(self.source, dirtokens[0].lineno, "Misplaced #elif")

                elif name == "else":
                    if ifstack:
                        if ifstack[-1][0]:
                            if enable:
                                enable = False
                            elif not iftrigger:
                                enable = True
                                iftrigger = True
                    else:
                        self.error(self.source, dirtokens[0].lineno, "Misplaced #else")

                elif name == "endif":
                    if ifstack:
                        enable, iftrigger = ifstack.pop()
                    else:
                        self.error(self.source, dirtokens[0].lineno, "Misplaced #endif")
                else:
                    # Unknown preprocessor directive
                    pass

            else:
                # Normal text
                if enable:
                    chunk.extend(x)

        for tok in self.expand_macros(chunk):
            yield tok
        chunk = []