Changeset 406 in dev for trunk/abdev


Ignore:
Timestamp:
Mar 2, 2008, 4:36:33 AM (17 years ago)
Author:
dai_9181
Message:

Enumを大改修。Enumメンバ初期値にリテラル、定数、Enumメンバを指定できるようにした。また、エラー行数を正確に表示可能にした。

Location:
trunk/abdev
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/BasicCompiler.vcproj

    r404 r406  
    13491349                        >
    13501350                        <FileConfiguration
     1351                            Name="Debug|Win32"
     1352                            >
     1353                            <Tool
     1354                                Name="VCCLCompilerTool"
     1355                                UsePrecompiledHeader="0"
     1356                            />
     1357                        </FileConfiguration>
     1358                        <FileConfiguration
    13511359                            Name="Release|Win32"
    13521360                            >
  • trunk/abdev/BasicCompiler32/MakePeHdr.cpp

    r358 r406  
    151151
    152152    //列挙体に関する情報を収集
    153     CEnumParent::InitEnum();
     153    compiler.enumInfoCollection.InitEnum();
    154154
    155155    //列挙体からクラスコードを生成
    156156    char *temp;
    157     temp=CEnumParent::GenerateSourceCode();
     157    temp=compiler.enumInfoCollection.GenerateSourceCode();
    158158    AddSourceCode(temp);
    159159    HeapDefaultFree(temp);
     
    16591659    delete pobj_Reloc;
    16601660
    1661     //列挙体に関する情報の破棄
    1662     CEnumParent::DestroyEnum();
    1663 
    16641661    //クラスに関するメモリを解放
    16651662    compiler.GetObjectModule().meta.GetClasses().Clear();
  • trunk/abdev/BasicCompiler64/BasicCompiler.vcproj

    r404 r406  
    13121312                        >
    13131313                        <FileConfiguration
     1314                            Name="Debug|Win32"
     1315                            >
     1316                            <Tool
     1317                                Name="VCCLCompilerTool"
     1318                                UsePrecompiledHeader="0"
     1319                            />
     1320                        </FileConfiguration>
     1321                        <FileConfiguration
    13141322                            Name="Release|Win32"
    13151323                            >
  • trunk/abdev/BasicCompiler64/MakePeHdr.cpp

    r358 r406  
    140140
    141141    //列挙体に関する情報を収集
    142     CEnumParent::InitEnum();
     142    compiler.enumInfoCollection.InitEnum();
    143143
    144144    //列挙体からクラスコードを生成
    145145    char *temp;
    146     temp=CEnumParent::GenerateSourceCode();
     146    temp = compiler.enumInfoCollection.GenerateSourceCode();
    147147    AddSourceCode(temp);
    148148    HeapDefaultFree(temp);
     
    16551655    delete pobj_Reloc;
    16561656
    1657     //列挙体に関する情報の破棄
    1658     CEnumParent::DestroyEnum();
    1659 
    16601657    //クラスに関するメモリを解放
    16611658    compiler.GetObjectModule().meta.GetClasses().Clear();
  • trunk/abdev/BasicCompiler_Common/Enum.cpp

    r402 r406  
    88#include "common.h"
    99
    10 CEnumParent **ppobj_EnumParent;
    11 int iEnumParentNum;
    12 
    13 CEnumMember::CEnumMember(char *name,int value){
    14     m_name=(char *)HeapAlloc(hHeap,0,lstrlen(name)+1);
    15     lstrcpy(m_name,name);
    16 
    17     m_value=value;
    18 }
    19 CEnumMember::~CEnumMember(){
    20     if(m_name) HeapDefaultFree(m_name);
    21 }
    22 
    23 
    24 CEnumParent::CEnumParent( const NamespaceScopes &namespaceScopes, const char *buffer,int nowLine)
    25     : namespaceScopes( namespaceScopes )
     10void EnumInfo::Collect( const char *buffer,int nowLine)
    2611{
    27     ppobj_EnumMember=(CEnumMember **)HeapAlloc(hHeap,0,1);
    28     iEnumMemberNum=0;
    29 
    30     int i=0,i2;
     12    this->members.clear();
     13
     14    int i=nowLine,i2;
    3115
    3216    if(!(buffer[i]==1&&buffer[i+1]==ESC_ENUM)) return;
     
    4731    }
    4832
    49     name = temporary;
    50 
    5133    if(buffer[i]=='\0'){
    5234        SetError(22,"Enum",nowLine);
     
    5436    }
    5537
    56     int NextValue=0;
     38    int currentValue = 0;
     39    bool isUseCurrentValue = true;
     40    std::string currentValueStr;
     41    std::string lastMemberName;
     42    char temp2[VN_SIZE];
    5743    while(1){
    5844        i++;
     
    7965        }
    8066
    81         if(buffer[i]!='='){
    82             NextValue++;
    83         }
    84         else{
    85             char temp2[VN_SIZE];
    86             for(i++,i2=0;;i2++,i++){
    87                 if(IsCommandDelimitation(buffer[i])){
    88                     temp2[i2]=0;
    89                     break;
    90                 }
    91                 temp2[i2]=buffer[i];
    92             }
    93             NextValue=atoi(temp2);
     67        if( buffer[i] != '=' )
     68        {
     69            if( isUseCurrentValue )
     70            {
     71                currentValue++;
     72
     73                sprintf( temp2, "%d", currentValue );
     74                currentValueStr = temp2;
     75            }
     76            else
     77            {
     78                currentValueStr = lastMemberName + "+1";
     79            }
     80        }
     81        else
     82        {
     83            i++;
     84            GetCommandToken( temp2, buffer, i );
     85
     86            _int64 i64data;
     87            if( StaticCalculation( false, temp2, 0, &i64data, Type() ) )
     88            {
     89                currentValue = static_cast<int>(i64data);
     90
     91                sprintf( temp2, "%d", currentValue );
     92                currentValueStr = temp2;
     93            }
     94            else
     95            {
     96                // 取得できなかった(なんらかの識別子を含む可能性あり)
     97                isUseCurrentValue = false;
     98
     99                currentValueStr = temp2;
     100            }
    94101        }
    95102
    96103        //メンバを追加
    97         ppobj_EnumMember=(CEnumMember **)HeapReAlloc(hHeap,0,ppobj_EnumMember,(iEnumMemberNum+1)*sizeof(CEnumMember *));
    98         ppobj_EnumMember[iEnumMemberNum]=new CEnumMember(temporary,NextValue);
    99         iEnumMemberNum++;
     104        this->members.push_back( EnumMember( temporary, currentValueStr, i ) );
     105
     106        lastMemberName = temporary;
    100107    }
    101108}
    102 CEnumParent::~CEnumParent(){
    103     int i;
    104     for(i=0;i<iEnumMemberNum;i++){
    105         delete ppobj_EnumMember[i];
    106     }
    107     HeapDefaultFree(ppobj_EnumMember);
    108 }
    109 
    110 
    111 
    112 void CEnumParent::InitEnum(void){
    113     ppobj_EnumParent=(CEnumParent **)HeapAlloc(hHeap,0,1);
    114     iEnumParentNum=0;
     109
     110
     111void EnumInfoCollection::InitEnum(void)
     112{
     113    this->clear();
    115114
    116115    const char *source = compiler.GetObjectModule().GetCurrentSource().GetBuffer();
     
    153152                if(source[i-2]==1&&source[i-1]==ESC_CONST) continue;
    154153            }
    155             ppobj_EnumParent=(CEnumParent **)HeapReAlloc(hHeap,0,ppobj_EnumParent,(iEnumParentNum+1)*sizeof(CEnumParent *));
    156             ppobj_EnumParent[iEnumParentNum]=new CEnumParent( namespaceScopes, source+i,i);
    157             iEnumParentNum++;
     154
     155            i2 = i + 2;
     156            GetCommandToken( temporary, source, i2 );
     157
     158            // 追加
     159            this->push_back( EnumInfo( namespaceScopes, temporary ) );
     160
     161            // 収集
     162            this->back().Collect( source, i );
    158163        }
    159164    }
    160165}
    161 void CEnumParent::DestroyEnum(void){
    162     int i;
    163     for(i=0;i<iEnumParentNum;i++){
    164         delete ppobj_EnumParent[i];
    165     }
    166     HeapDefaultFree(ppobj_EnumParent);
    167 }
    168 
    169 char *CEnumParent::GenerateSourceCode(void){
     166
     167char *EnumInfoCollection::GenerateSourceCode(void){
    170168    char *buffer;
    171169    int MaxSize,length;
     
    176174    buffer[0]=0;
    177175
    178     for(int i=0;i<iEnumParentNum;i++){
    179         CEnumParent *parent;
    180         parent=ppobj_EnumParent[i];
    181 
    182         BOOST_FOREACH( const string &namespaceStr, parent->GetNamespaceScopes() ){
     176    const EnumInfoCollection &thisEnumInfoCollection = *this;
     177    BOOST_FOREACH( const EnumInfo &enumInfo, thisEnumInfoCollection )
     178    {
     179        BOOST_FOREACH( const string &namespaceStr, enumInfo.GetNamespaceScopes() ){
    183180            sprintf(buffer+length,"Namespace %s\n",namespaceStr.c_str());
    184181            length+=lstrlen(buffer+length);
    185182        }
    186183
    187         sprintf(buffer+length,"Class Enum %s\n",parent->GetName().c_str());
     184        sprintf(buffer+length,"Class Enum %s\n",enumInfo.GetName().c_str());
    188185        length+=lstrlen(buffer+length);
    189186        lstrcpy(buffer+length,"\tInherits EnumBase\n");
    190187        length+=lstrlen(buffer+length);
    191         sprintf(buffer+length,"\tSub %s(value As Long,lpszName As LPSTR)\n",parent->GetName().c_str());
     188        sprintf(buffer+length,"\tSub %s(value As Long,lpszName As LPSTR)\n",enumInfo.GetName().c_str());
    192189        length+=lstrlen(buffer+length);
    193190        lstrcpy(buffer+length,"\t\tEnumBase(value,lpszName)\n");
     
    197194        lstrcpy(buffer+length,"Public\n");
    198195        length+=lstrlen(buffer+length);
    199         sprintf(buffer+length,"\tSub %s()\n",parent->GetName().c_str());
    200         length+=lstrlen(buffer+length);
    201         if(parent->iEnumMemberNum){
    202             sprintf(buffer+length,"\t\tEnumBase(%d,\"%s\")\n",
    203                 parent->ppobj_EnumMember[0]->m_value,
    204                 parent->ppobj_EnumMember[0]->m_name);
    205             length+=lstrlen(buffer+length);
    206         }
    207         lstrcpy(buffer+length,"\tEnd Sub\n");
    208         length+=lstrlen(buffer+length);
    209         sprintf(buffer+length,"\tSub ~%s()\n",parent->GetName().c_str());
    210         length+=lstrlen(buffer+length);
    211         lstrcpy(buffer+length,"\tEnd Sub\n");
    212         length+=lstrlen(buffer+length);
    213 
    214         for(int i2=0;i2<parent->iEnumMemberNum;i2++){
     196        sprintf(buffer+length,"\tSub %s()\n",enumInfo.GetName().c_str());
     197        length+=lstrlen(buffer+length);
     198        if( enumInfo.GetMembers().size()){
     199            sprintf(buffer+length,"\t\tEnumBase(%s)\n",
     200                enumInfo.GetMembers().begin()->GetName().c_str() );
     201            length+=lstrlen(buffer+length);
     202        }
     203        lstrcpy(buffer+length,"\tEnd Sub\n");
     204        length+=lstrlen(buffer+length);
     205        sprintf(buffer+length,"\tSub ~%s()\n",enumInfo.GetName().c_str());
     206        length+=lstrlen(buffer+length);
     207        lstrcpy(buffer+length,"\tEnd Sub\n");
     208        length+=lstrlen(buffer+length);
     209
     210        BOOST_FOREACH( const EnumMember &member, enumInfo.GetMembers() )
     211        {
     212            sprintf(buffer+length,"\tStatic %s As %s((%s) As Long,\"%s\")\n",
     213                member.GetName().c_str(),
     214                enumInfo.GetName().c_str(),
     215                member.GetValueStr().c_str(),
     216                member.GetName().c_str());
     217            length+=lstrlen(buffer+length);
     218        }
     219
     220        sprintf(buffer+length,"\tFunction Operator or (enumBase As %s) As %s\n",enumInfo.GetName().c_str(),enumInfo.GetName().c_str());
     221        length+=lstrlen(buffer+length);
     222        sprintf(buffer+length,"\t\tReturn New %s(This.value or enumBase.value, \"custom\")\n",enumInfo.GetName().c_str());
     223        length+=lstrlen(buffer+length);
     224        lstrcpy(buffer+length,"\tEnd Function\n");
     225        length+=lstrlen(buffer+length);
     226
     227        sprintf(buffer+length,"\tFunction Operator and (enumBase As %s) As %s\n",enumInfo.GetName().c_str(),enumInfo.GetName().c_str());
     228        length+=lstrlen(buffer+length);
     229        sprintf(buffer+length,"\t\tReturn New %s(This.value and enumBase.value, \"custom\")\n",enumInfo.GetName().c_str());
     230        length+=lstrlen(buffer+length);
     231        lstrcpy(buffer+length,"\tEnd Function\n");
     232        length+=lstrlen(buffer+length);
     233
     234        /*
     235        sprintf(buffer+length,"\tOverride Function ToString() As String\n",enumInfo.TypeName);
     236        length+=lstrlen(buffer+length);
     237        lstrcpy(buffer+length,"\t\tSelect Case value\n");
     238        length+=lstrlen(buffer+length);
     239        for(i2=0;i2<enumInfo.iEnumMemberNum;i2++){
    215240            CEnumMember *member;
    216             member=parent->ppobj_EnumMember[i2];
    217 
    218             sprintf(buffer+length,"\tStatic %s As %s(%d,\"%s\")\n",
    219                 member->m_name,
    220                 parent->GetName().c_str(),
    221                 member->m_value,
    222                 member->m_name);
    223             length+=lstrlen(buffer+length);
    224         }
    225 
    226         sprintf(buffer+length,"\tFunction Operator or (enumBase As %s) As %s\n",parent->GetName().c_str(),parent->GetName().c_str());
    227         length+=lstrlen(buffer+length);
    228         sprintf(buffer+length,"\t\tReturn New %s(This.value or enumBase.value, \"custom\")\n",parent->GetName().c_str());
     241            member=enumInfo.ppobj_EnumMember[i2];
     242
     243            sprintf(buffer+length,"\t\t\tCase %d\n",member->m_value);
     244            length+=lstrlen(buffer+length);
     245            sprintf(buffer+length,"\t\t\t\tReturn \"%s\"\n",member->m_name);
     246            length+=lstrlen(buffer+length);
     247        }
     248        lstrcpy(buffer+length,"\t\tEnd Select\n");
    229249        length+=lstrlen(buffer+length);
    230250        lstrcpy(buffer+length,"\tEnd Function\n");
    231251        length+=lstrlen(buffer+length);
    232252
    233         sprintf(buffer+length,"\tFunction Operator and (enumBase As %s) As %s\n",parent->GetName().c_str(),parent->GetName().c_str());
    234         length+=lstrlen(buffer+length);
    235         sprintf(buffer+length,"\t\tReturn New %s(This.value and enumBase.value, \"custom\")\n",parent->GetName().c_str());
    236         length+=lstrlen(buffer+length);
    237         lstrcpy(buffer+length,"\tEnd Function\n");
    238         length+=lstrlen(buffer+length);
    239 
    240         /*
    241         sprintf(buffer+length,"\tOverride Function ToString() As String\n",parent->TypeName);
     253       
     254        sprintf(buffer+length,"\tSub Operator= (ByRef value As %s)\n",enumInfo.TypeName);
     255        length+=lstrlen(buffer+length);
     256        lstrcpy(buffer+length,"\t\tThis.Copy(ByVal VarPtr(value))\n");
     257        length+=lstrlen(buffer+length);
     258        lstrcpy(buffer+length,"\tEnd Sub\n");
     259        length+=lstrlen(buffer+length);
     260
     261        sprintf(buffer+length,"\tSub Operator= (ByRef value As String)\n",enumInfo.TypeName);
    242262        length+=lstrlen(buffer+length);
    243263        lstrcpy(buffer+length,"\t\tSelect Case value\n");
    244264        length+=lstrlen(buffer+length);
    245         for(i2=0;i2<parent->iEnumMemberNum;i2++){
     265        for(i2=0;i2<enumInfo.iEnumMemberNum;i2++){
    246266            CEnumMember *member;
    247             member=parent->ppobj_EnumMember[i2];
    248 
    249             sprintf(buffer+length,"\t\t\tCase %d\n",member->m_value);
    250             length+=lstrlen(buffer+length);
    251             sprintf(buffer+length,"\t\t\t\tReturn \"%s\"\n",member->m_name);
     267            member=enumInfo.ppobj_EnumMember[i2];
     268
     269            sprintf(buffer+length,"\t\t\tCase \"%s\"\n",member->m_name);
     270            length+=lstrlen(buffer+length);
     271            sprintf(buffer+length,"\t\t\t\tThis=%s.%s\n",enumInfo.TypeName,member->m_name);
    252272            length+=lstrlen(buffer+length);
    253273        }
    254274        lstrcpy(buffer+length,"\t\tEnd Select\n");
    255275        length+=lstrlen(buffer+length);
    256         lstrcpy(buffer+length,"\tEnd Function\n");
    257         length+=lstrlen(buffer+length);
    258 
    259        
    260         sprintf(buffer+length,"\tSub Operator= (ByRef value As %s)\n",parent->TypeName);
    261         length+=lstrlen(buffer+length);
    262         lstrcpy(buffer+length,"\t\tThis.Copy(ByVal VarPtr(value))\n");
    263         length+=lstrlen(buffer+length);
    264         lstrcpy(buffer+length,"\tEnd Sub\n");
    265         length+=lstrlen(buffer+length);
    266 
    267         sprintf(buffer+length,"\tSub Operator= (ByRef value As String)\n",parent->TypeName);
    268         length+=lstrlen(buffer+length);
    269         lstrcpy(buffer+length,"\t\tSelect Case value\n");
    270         length+=lstrlen(buffer+length);
    271         for(i2=0;i2<parent->iEnumMemberNum;i2++){
    272             CEnumMember *member;
    273             member=parent->ppobj_EnumMember[i2];
    274 
    275             sprintf(buffer+length,"\t\t\tCase \"%s\"\n",member->m_name);
    276             length+=lstrlen(buffer+length);
    277             sprintf(buffer+length,"\t\t\t\tThis=%s.%s\n",parent->TypeName,member->m_name);
    278             length+=lstrlen(buffer+length);
    279         }
    280         lstrcpy(buffer+length,"\t\tEnd Select\n");
    281         length+=lstrlen(buffer+length);
    282         lstrcpy(buffer+length,"\tEnd Sub\n");
    283         length+=lstrlen(buffer+length);
    284 
    285         sprintf(buffer+length,"\tSub Operator= (value As Long)\n",parent->TypeName);
     276        lstrcpy(buffer+length,"\tEnd Sub\n");
     277        length+=lstrlen(buffer+length);
     278
     279        sprintf(buffer+length,"\tSub Operator= (value As Long)\n",enumInfo.TypeName);
    286280        length+=lstrlen(buffer+length);
    287281        lstrcpy(buffer+length,"\t\tm_Value=value\n");
     
    293287        length+=lstrlen(buffer+length);
    294288
    295         BOOST_FOREACH( const string &namespaceStr, parent->GetNamespaceScopes() ){
     289        BOOST_FOREACH( const string &namespaceStr, enumInfo.GetNamespaceScopes() ){
    296290            lstrcpy( buffer+length, "End Namespace\n" );
    297291            length+=lstrlen(buffer+length);
  • trunk/abdev/BasicCompiler_Common/Enum.h

    r322 r406  
    33#include <Namespace.h>
    44
    5 class CEnumMember{
     5class EnumMember
     6{
     7    std::string name;
     8    std::string value;
     9    int sourceIndex;
    610public:
    7     char *m_name;
    8     int m_value;
    9     CEnumMember(char *name,int value);
    10     ~CEnumMember();
     11    EnumMember( const std::string &name, const std::string &value, int sourceIndex )
     12        : name( name )
     13        , value( value )
     14        , sourceIndex( sourceIndex )
     15    {
     16    }
     17    const std::string &GetName() const
     18    {
     19        return name;
     20    }
     21    const std::string &GetValueStr() const
     22    {
     23        return value;
     24    }
     25    int GetSourceIndex() const
     26    {
     27        return sourceIndex;
     28    }
    1129};
    1230
    13 class CEnumParent{
    14     NamespaceScopes namespaceScopes;
    15     string name;
     31class EnumInfo
     32    : public Symbol
     33{
    1634
    1735    BOOL bConst;
    1836
    19     CEnumMember **ppobj_EnumMember;
    20     int iEnumMemberNum;
     37    std::vector<EnumMember> members;
    2138public:
    2239
    23     CEnumParent( const NamespaceScopes &namespaceScopes, const char *buffer,int nowLine);
    24     ~CEnumParent();
    25 
    26     const NamespaceScopes &GetNamespaceScopes() const
     40    EnumInfo( const NamespaceScopes &namespaceScopes, const std::string &name )
     41        : Symbol( namespaceScopes, name )
    2742    {
    28         return namespaceScopes;
    29     }
    30     const string &GetName() const
    31     {
    32         return name;
    3343    }
    3444
     45    const std::vector<EnumMember> &GetMembers() const
     46    {
     47        return members;
     48    }
     49
     50    void Collect( const char *buffer, int nowLine );
     51
     52    const EnumMember &GetEnumMember( const std::string &memberName ) const
     53    {
     54        BOOST_FOREACH( const EnumMember &member, members )
     55        {
     56            if( member.GetName() == memberName )
     57            {
     58                return member;
     59            }
     60        }
     61        throw;
     62    }
     63};
     64
     65class EnumInfoCollection
     66    : public std::vector<EnumInfo>
     67{
    3568public:
    36     static void InitEnum(void);
    37     static void DestroyEnum(void);
     69    const EnumInfo *Find( const Symbol &symbol ) const
     70    {
     71        const EnumInfoCollection &thisEnumInfoCollection = *this;
     72        BOOST_FOREACH( const EnumInfo &enumInfo, thisEnumInfoCollection )
     73        {
     74            if( enumInfo.IsEqualSymbol( symbol ) )
     75            {
     76                return &enumInfo;
     77            }
     78        }
     79        return NULL;
     80    };
    3881
    39     static char *GenerateSourceCode(void);
     82    void InitEnum(void);
     83    char *GenerateSourceCode(void);
    4084};
    41 extern CEnumParent **ppobj_EnumParent;
    42 extern int iEnumParentNum;
  • trunk/abdev/BasicCompiler_Common/include/Compiler.h

    r357 r406  
    1010#include <Delegate.h>
    1111#include <Exception.h>
     12#include <../Enum.h>
    1213
    1314class Compiler
     
    141142    std::string globalAreaProcName;
    142143
     144    // 列挙型
     145    EnumInfoCollection enumInfoCollection;
     146
    143147
    144148    bool StringToType( const std::string &typeName, Type &type );
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r402 r406  
    1515#include "../../BasicCompiler32/opcode.h"
    1616#endif
     17
     18#include <../Enum.h>
    1719
    1820
     
    10681070        }
    10691071
     1072        // コンパイル中クラスとしてセット
     1073        compiler.pCompilingClass = &objClass;
     1074
     1075        const EnumInfo *pEnumInfo = NULL;
     1076        if( objClass.IsEnum() )
     1077        {
     1078            pEnumInfo = compiler.enumInfoCollection.Find( objClass );
     1079        }
     1080
    10701081        int i=0;
    1071         BOOST_FOREACH( CMember *member, objClass.GetStaticMembers() ){
     1082        BOOST_FOREACH( CMember *member, objClass.GetStaticMembers() )
     1083        {
     1084            if( pEnumInfo )
     1085            {
     1086                cp = pEnumInfo->GetEnumMember( member->GetName() ).GetSourceIndex();
     1087            }
     1088
    10721089            char temporary[VN_SIZE];
    10731090            sprintf(temporary,"%s.%s",objClass.GetName().c_str(),member->GetName().c_str());
     
    10821099            i++;
    10831100        }
     1101
     1102        compiler.pCompilingClass = NULL;
    10841103    }
    10851104
Note: See TracChangeset for help on using the changeset viewer.