Esempio n. 1
0
 def write_enum_block(self, b):
     p = self.p
     i = 0
     while i < len(b.value):
         line = "    " * self.indent
         tokens = b.value[i].value
         line += self.format_line(tokens)
         if i < len(b.value) - 1:
             line += ","
         self.in_row, _ = parser.get_row_col(tokens[0])
         self.add_line(line)
         i += 1
Esempio n. 2
0
    def do_output(self):
        prev = None
        while self.stack:
            tok = self.stack.pop(0)
            if isinstance(tok, str):
                self.line += tok
                prev = None
                continue

            if tok:
                self.in_row, _ = parser.get_row_col(tok)
            else:
                prev = None

            word = self.format_op(tok)
            if not word:
                prev = None
                continue
            if prev:
                if prev[-1].isalnum() and word[0].isalnum():
                    self.line += " "

            self.line += word
            prev = word
Esempio n. 3
0
    def write_block(self, b, is_macro = False):
        self.current_block.append(b)

        p = self.p
        i = 0
        n = len(b.value)
        while i < n:
            s = b.value[i]
            i += 1

            if s.value:
                self.in_row, _ = parser.get_row_col(s)
            
            block = None
            if i < n:
                if b.value[i].kind == p.BLOCK:
                    block = b.value[i]
                    i += 1

            if not self.in_header:
                for c in s.comments:
                    self.code += self.indent * "    "
                    self.code += "//"
                    self.code += c.value.rstrip()
                    self.code += "\n"
                    self.out_crow += 1
                    
            if s.kind == p.LINE:
                self.write_line(s, block)
            elif s.kind == p.STATEMENT:
                self.handle_statement(s)
            elif s.kind == p.TYPE:
                self.handle_class(s)
            elif s.kind == p.FUNCTION:
                self.current_function.append(s)
                self.handle_function(s)
                self.current_function.pop()
            elif s.kind == p.IMPORT:
                self.handle_import(s.value[1:], s.is_static)
            elif s.kind == p.PREPROCESSOR:
                self.handle_preprocessor(s)
            elif s.kind == p.MACRO:
                self.handle_macro(s)
            elif s.kind == p.ENUM:
                self.handle_enum(s)
            elif s.kind == p.LABEL:
                self.add_iline(self.format_line(s.value[1:]) + ":;")
            elif s.kind == p.GOTO:
                self.add_iline("goto " + self.format_line(s.value[1:]) + ";")
            elif s.kind == p.INCLUDE:
                self.p = s.value

                if not self.no_lines:
                    prev_crow = self.out_crow
                    self.code += "#line 1 \"" + self.p.filename + "\"\n"
                    self.out_crow = 1
                    
                    prev_hrow = self.out_hrow
                    self.header += "#line 1 \"" + self.p.filename + "\"\n"
                    self.out_hrow = 1
                
                self.undef_at_end = []
                self.write_block(self.p.root)
                self.p = p

                if not self.no_lines:
                    self.out_crow = prev_crow + 1
                    self.code += "#line " + str(self.out_crow) + " \"" +\
                        self.p.filename + "\"\n"
                    
                    self.out_hrow = prev_hrow + 1
                    self.header += "#line " + str(self.out_hrow) + " \"" +\
                        self.p.filename + "\"\n"
                
                for u in self.undef_at_end:
                    self.code += "#undef " + u + "\n"
                    self.out_crow += 1
                
            else:
                row, col = parser.get_row_col(s)
                p.error_pos("Unexpected node type %d." % s.kind, row, col)
        self.current_block.pop()