Changeset 33810

Show
Ignore:
Timestamp:
06/06/09 01:33:39 (4 years ago)
Author:
nishio
Message:

make cpp encoder/decoder from python encoder/decoder

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/python/retrograde/cpp_en_decoder.py

    r33809 r33810  
    99        name = self.node_name + suffix 
    1010        vname = self.var_name + suffix 
    11         return ["%s = %s" % (name, vname)] 
     11        return ["%s = %s;" % (name, vname)] 
    1212     
    1313    @staticmethod 
     
    1616        name = self.node_name + suffix 
    1717        vname = self.var_name + suffix 
    18         return ["%s = %s" % (vname, name)] 
     18        return ["%s = %s;" % (vname, name)] 
    1919 
    2020class Take(object): 
     
    2424        name = self.node_name + suffix 
    2525        vname = self.var_name + suffix 
    26         result = ["%s = %s" % (name, vname)] 
     26        result = ["%s = %s;" % (name, vname)] 
    2727        for c in context[self.res.name]: 
    28             result.append("if %s < %s: %s -= 1" % (c, vname, name)) 
     28            result.append("if(%s < %s) %s--;" % (c, vname, name)) 
    2929        context[self.res.name].append(vname) 
    3030        return result 
     
    3535        name = self.node_name + suffix 
    3636        vname = self.var_name + suffix 
    37         result = ["%s = %s" % (vname, name)] 
     37        result = ["%s = %s;" % (vname, name)] 
    3838        for c in context[self.res.name]: 
    39             result.append("if %s <= %s: %s += 1" % (c, vname, vname)) 
     39            result.append("if(%s <= %s) %s++;" % (c, vname, vname)) 
    4040        context[self.res.name].append(vname) 
    4141        return result 
     
    5050        c1 = deepcopy(context) 
    5151        c1["suffix"] = suffix + "_1" 
    52         result = self.rule.get_python_encoder(c0) + self.rule.get_python_encoder(c1) 
     52        result = self.rule.get_cpp_encoder(c0) + self.rule.get_cpp_encoder(c1) 
    5353        name = self.get_node_name(context) 
    5454        rname0 = self.rule.get_node_name(c0) 
    5555        rname1 = self.rule.get_node_name(c1) 
    5656         
    57         result += ["if %(rname0)s > %(rname1)s: " 
    58                    "%(rname0)s, %(rname1)s = %(rname1)s, %(rname0)s" 
     57        result += ["if(%(rname0)s > %(rname1)s) swap(%(rname0)s, %(rname1));" 
    5958                   % locals()] 
    6059 
     
    6261        if self.is_repeatable(): 
    6362            result += [ 
    64                 "%(ret)s = %(n)d * %(x)s - %(x)s * (%(x)s - 1) / 2 + %(y)s - %(x)s" 
     63                "%(ret)s = %(n)d * %(x)s - %(x)s * (%(x)s - 1) / 2 + %(y)s - %(x)s;" 
    6564                % dict(ret=name, x=rname0, y=rname1, n=n)] 
    6665        else: 
    6766            result += [ 
    68                 "%(ret)s = %(n)d * %(x)s - %(x)s * (%(x)s + 1) / 2 + %(y)s - %(x)s" 
     67                "%(ret)s = %(n)d * %(x)s - %(x)s * (%(x)s + 1) / 2 + %(y)s - %(x)s;" 
    6968                % dict(ret=name, x=rname0, y=rname1, n=n)] 
    7069 
     
    8786        if self.is_repeatable(): 
    8887            result += [ 
    89                 "n = %d" % n, 
    90                 "%s = 0" % rname0, 
    91                 "while %s >= n:" % name, 
    92                 "    %s -= n" % name, 
    93                 "    n -= 1", 
    94                 "    %s += 1" % rname0, 
    95                 "%s = %s + %s" % (rname1, name, rname0),] 
     88                "n = %d;" % n, 
     89                "%s = 0;" % rname0, 
     90                "while(%s >= n){" % name, 
     91                "    %s -= n;" % name, 
     92                "    n--;", 
     93                "    %s++;" % rname0, 
     94                "}", 
     95                "%s = %s + %s;" % (rname1, name, rname0),] 
    9696        else: 
    9797            result += [ 
    98                 "n = %d" % (n - 1), 
    99                 "%s = 0" % rname0, 
    100                 "while %s >= n:" % name, 
    101                 "    %s -= n" % name, 
    102                 "    n -= 1", 
    103                 "    %s += 1" % rname0, 
    104                 "%s = %s + %s" % (rname1, name, rname0),] 
    105  
    106         result += self.rule.get_python_decoder(c0)  
    107         result += self.rule.get_python_decoder(c1) 
     98                "n = %d;" % (n - 1), 
     99                "%s = 0;" % rname0, 
     100                "while(%s >= n){" % name, 
     101                "    %s -= n;" % name, 
     102                "    n--;", 
     103                "    %s++;" % rname0, 
     104                "}", 
     105                "%s = %s + %s;" % (rname1, name, rname0),] 
     106 
     107        result += self.rule.get_cpp_decoder(c0)  
     108        result += self.rule.get_cpp_decoder(c1) 
    108109        return result 
    109110     
     
    119120        if self.unorder_info: 
    120121            orig_flag = self.unorder_info 
    121             result += ["%s = not(%s_0 ^ %s_1)" % (vname, orig_flag, orig_flag)] 
    122  
    123         result += ["if %s:" % vname] 
    124         result += utils.indent(self.r2.get_python_encoder(deepcopy(context))) 
    125         result += ["    %s = %s" % (name, self.r2.get_node_name(context))] 
    126         result += ["else:"] 
    127         result += utils.indent(self.r1.get_python_encoder(deepcopy(context))) 
    128         result += ["    %s = %s + %s" % ( 
     122            result += ["%s = !(%s_0 ^ %s_1);" % (vname, orig_flag, orig_flag)] 
     123 
     124        result += ["if(%s){" % vname] 
     125        result += utils.indent(self.r2.get_cpp_encoder(deepcopy(context))) 
     126        result += ["    %s = %s;" % (name, self.r2.get_node_name(context))] 
     127        result += ["}else{"] 
     128        result += utils.indent(self.r1.get_cpp_encoder(deepcopy(context))) 
     129        result += ["    %s = %s + %s;" % ( 
    129130            name, self.r1.get_node_name(context), r2size)] 
    130  
     131        result += ["}"] 
    131132        return result 
    132133 
     
    140141        if self.unorder_info: 
    141142            orig_flag = self.unorder_info 
    142             result += ["%s_0 = False" % (orig_flag,)] 
    143  
    144         result += ["if %s < %d:" % (name, n)] 
    145         result += ["    %s = True" % (vname, )] 
    146         result += ["    %s = %s" % (self.r2.get_node_name(context), name)] 
    147         result += utils.indent(self.r2.get_python_decoder(deepcopy(context))) 
    148         result += ["else:"] 
    149         result += ["    %s = False" % (vname, )] 
    150         result += ["    %s = %s - %d" % ( 
     143            result += ["%s_0 = false;" % (orig_flag,)] 
     144 
     145        result += ["if(%s < %d){" % (name, n)] 
     146        result += ["    %s = true;" % (vname, )] 
     147        result += ["    %s = %s;" % (self.r2.get_node_name(context), name)] 
     148        result += utils.indent(self.r2.get_cpp_decoder(deepcopy(context))) 
     149        result += ["}else{"] 
     150        result += ["    %s = false;" % (vname, )] 
     151        result += ["    %s = %s - %d;" % ( 
    151152            self.r1.get_node_name(context), name, n)] 
    152         result += utils.indent(self.r1.get_python_decoder(deepcopy(context))) 
     153        result += utils.indent(self.r1.get_cpp_decoder(deepcopy(context))) 
     154        result += ["}"] 
    153155        if self.unorder_info: 
    154156            orig_flag = self.unorder_info 
    155             result += ["%s_1 = not(%s ^ %s_0)" % (orig_flag, vname, orig_flag)] 
     157            result += ["%s_1 = !(%s ^ %s_0);" % (orig_flag, vname, orig_flag)] 
    156158 
    157159        return result 
     
    169171            oname = self.unordered_info 
    170172            # 正規化のコードを入れる 
    171             result += ["if %s_1:" % oname] 
    172             for typ, v, com in self.r1.vars: 
    173                 result += utils.indent(["%s = %s_0" % (v, v)]) 
    174             for typ, v, com in self.r2.vars: 
    175                 result += utils.indent(["%s = %s_1" % (v, v)]) 
    176             result += ["else:"] 
    177             for typ, v, com in self.r1.vars: 
    178                 result += utils.indent(["%s = %s_1" % (v, v)]) 
    179             for typ, v, com in self.r2.vars: 
    180                 result += utils.indent(["%s = %s_0" % (v, v)]) 
    181  
    182         result += self.r1.get_python_encoder(context)  
    183         result += self.r2.get_python_encoder(context) 
    184         result += ["%s = %s * %s + %s" % ( 
     173            result += ["if(%s_1){" % oname] 
     174            for typ, v, com in self.r1.vars: 
     175                result += utils.indent(["%s = %s_0;" % (v, v)]) 
     176            for typ, v, com in self.r2.vars: 
     177                result += utils.indent(["%s = %s_1;" % (v, v)]) 
     178            result += ["}else{"] 
     179            for typ, v, com in self.r1.vars: 
     180                result += utils.indent(["%s = %s_1;" % (v, v)]) 
     181            for typ, v, com in self.r2.vars: 
     182                result += utils.indent(["%s = %s_0;" % (v, v)]) 
     183            result += ["}"] 
     184 
     185        result += self.r1.get_cpp_encoder(context)  
     186        result += self.r2.get_cpp_encoder(context) 
     187        result += ["%s = %s * %s + %s;" % ( 
    185188            self.get_node_name(context), r1name, 
    186189            self.r2.size(copy), r2name)] 
     
    192195        name = self.get_node_name(context) 
    193196        result = [ 
    194             "%s = %s / %s" % ( 
     197            "%s = %s / %s;" % ( 
    195198                self.r1.get_node_name(context), name, n), 
    196             "%s = %s %% %s" % ( 
     199            "%s = %s %% %s;" % ( 
    197200                self.r2.get_node_name(context), name, n)] 
    198         result += self.r1.get_python_decoder(context) 
    199         result += self.r2.get_python_decoder(context) 
     201        result += self.r1.get_cpp_decoder(context) 
     202        result += self.r2.get_cpp_decoder(context) 
    200203        # 正規化戻しのコードを入れる(foo_? = foo) 
    201204        if self.unordered_info: 
     
    203206            r1vname = self.r1.var_name 
    204207            r2vname = self.r2.var_name 
    205             result += ["if %s_0:" % oname] 
    206             for typ, v, com in self.r1.vars: 
    207                 result += utils.indent(["%s_1 = %s" % (v, v)]) 
    208             for typ, v, com in self.r2.vars: 
    209                 result += utils.indent(["%s_0 = %s" % (v, v)]) 
    210             result += ["else:"] 
    211             for typ, v, com in self.r1.vars: 
    212                 result += utils.indent(["%s_0 = %s" % (v, v)]) 
    213             for typ, v, com in self.r2.vars: 
    214                 result += utils.indent(["%s_1 = %s" % (v, v)]) 
    215  
    216         return result 
     208            result += ["if(%s_0){" % oname] 
     209            for typ, v, com in self.r1.vars: 
     210                result += utils.indent(["%s_1 = %s;" % (v, v)]) 
     211            for typ, v, com in self.r2.vars: 
     212                result += utils.indent(["%s_0 = %s;" % (v, v)]) 
     213            result += ["}else{"] 
     214            for typ, v, com in self.r1.vars: 
     215                result += utils.indent(["%s_0 = %s;" % (v, v)]) 
     216            for typ, v, com in self.r2.vars: 
     217                result += utils.indent(["%s_1 = %s;" % (v, v)]) 
     218 
     219            result += "}"; 
     220        return result