Ignore:
Timestamp:
May 4, 2008, 1:09:11 AM (16 years ago)
Author:
dai_9181
Message:

CollectTypeDefsメソッドをLexicalAnalyzerクラスに移動した。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/TypeDef.cpp

    r523 r542  
    44#include <Compiler.h>
    55
    6 TypeDef::TypeDef( const NamespaceScopes &namespaceScopes, const std::string &name, const std::string &baseName, int nowLine )
     6TypeDef::TypeDef( const NamespaceScopes &namespaceScopes, const std::string &name, const std::string &baseName, const Type &baseType )
    77    : Symbol( namespaceScopes, name )
    88    , baseName( baseName )
     9    , baseType( baseType )
    910{
    10     if( !compiler.StringToType( baseName, baseType ) ){
    11         compiler.errorMessenger.Output(3, baseName, nowLine );
    12         return;
    13     }
    1411}
    1512/*
     
    5653    this->push_back( typeDef );
    5754}
     55
    5856int TypeDefCollection::GetIndex( const NamespaceScopes &namespaceScopes, const std::string &name ) const{
    5957    int max = (int)(*this).size();
     
    7270    return GetIndex( NamespaceScopes( AreaName ), NestName );
    7371}
    74 
    75 void TypeDefCollection::Add( const NamespaceScopes &namespaceScopes, const std::string &expression, int nowLine ){
    76     int i;
    77     char temporary[VN_SIZE];
    78 
    79     for(i=0;;i++){
    80         if(expression[i]=='='||expression[i]=='\0'){
    81             temporary[i]=0;
    82             break;
    83         }
    84         temporary[i]=expression[i];
    85     }
    86 
    87     if(expression[i]!='='){
    88         compiler.errorMessenger.Output(10,"TypeDef",nowLine);
    89         return;
    90     }
    91 
    92     const char *pTemp=expression.c_str()+i+1;
    93 
    94     //識別文字のエラーチェック(新しい型)
    95     i=0;
    96     for(;;i++){
    97         if(temporary[i]=='\0') break;
    98         if( !( IsVariableChar( temporary[i], true) ) ){
    99             compiler.errorMessenger.Output(10,"TypeDef",nowLine);
    100             return;
    101         }
    102     }
    103 
    104     //識別文字のエラーチェック(コピー元の型)
    105     if(pTemp[0]=='*'&&pTemp[1]==1&&(pTemp[2]==ESC_FUNCTION||pTemp[2]==ESC_SUB)){
    106         //関数ポインタ
    107         if(pTemp[3]!='('){
    108             compiler.errorMessenger.Output(10,"TypeDef",nowLine);
    109             return;
    110         }
    111     }
    112     else{
    113         i=0;
    114         while(pTemp[i]=='*') i++;
    115         for(;;i++){
    116             if(pTemp[i]=='\0') break;
    117             if( !( IsVariableChar( pTemp[i], true) ) )
    118             {
    119                 compiler.errorMessenger.Output(10,"TypeDef",nowLine);
    120                 return;
    121             }
    122         }
    123     }
    124 
    125     //識別子が重複している場合はエラーにする
    126     if(lstrcmp(temporary,pTemp)==0){
    127         compiler.errorMessenger.Output(1,NULL,nowLine);
    128         return;
    129     }
    130 
    131 
    132 
    133     //////////////////////////
    134     // TypeDef情報を追加
    135     //////////////////////////
    136 
    137     Add( namespaceScopes, temporary, pTemp, nowLine );
    138 }
    139 
    140 void TypeDefCollection::CollectTypeDefs(){
    141 
    142     // 名前空間管理
    143     NamespaceScopes &namespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
    144     namespaceScopes.clear();
    145 
    146     // Importsされた名前空間の管理
    147     NamespaceScopesCollection &importedNamespaces = compiler.GetNamespaceSupporter().GetImportedNamespaces();
    148     importedNamespaces.clear();
    149 
    150     int i=-1, i2;
    151     char temporary[VN_SIZE];
    152     while(1){
    153         extern char *basbuf;
    154 
    155         i++;
    156 
    157         if( basbuf[i] == 1 && basbuf[i+1] == ESC_NAMESPACE ){
    158             for(i+=2,i2=0;;i2++,i++){
    159                 if( IsCommandDelimitation( basbuf[i] ) ){
    160                     temporary[i2]=0;
    161                     break;
    162                 }
    163                 temporary[i2]=basbuf[i];
    164             }
    165             namespaceScopes.push_back( temporary );
    166 
    167             continue;
    168         }
    169         else if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENDNAMESPACE ){
    170             if( namespaceScopes.size() <= 0 ){
    171                 compiler.errorMessenger.Output(12, "End Namespace", i );
    172             }
    173             else{
    174                 namespaceScopes.pop_back();
    175             }
    176 
    177             i += 2;
    178             continue;
    179         }
    180         else if( basbuf[i] == 1 && basbuf[i+1] == ESC_IMPORTS ){
    181             for(i+=2,i2=0;;i2++,i++){
    182                 if( IsCommandDelimitation( basbuf[i] ) ){
    183                     temporary[i2]=0;
    184                     break;
    185                 }
    186                 temporary[i2]=basbuf[i];
    187             }
    188             if( !compiler.GetNamespaceSupporter().ImportsNamespace( temporary ) )
    189             {
    190                 compiler.errorMessenger.Output(64,temporary,i );
    191             }
    192 
    193             continue;
    194         }
    195         else if( basbuf[i] == 1 && basbuf[i+1] == ESC_CLEARNAMESPACEIMPORTED ){
    196             importedNamespaces.clear();
    197             continue;
    198         }
    199 
    200         if( basbuf[i]==1 ){
    201             char temporary[VN_SIZE];
    202             if(basbuf[i+1]==ESC_TYPEDEF){
    203                 int i2 = 0;
    204                 for(i+=2;;i2++,i++){
    205                     if(basbuf[i]=='\n'){
    206                         temporary[i2]=0;
    207                         break;
    208                     }
    209                     temporary[i2]=basbuf[i];
    210                     if(basbuf[i]=='\0') break;
    211                 }
    212                 Add( namespaceScopes, temporary, i );
    213 
    214                 continue;
    215             }
    216             else if( basbuf[i+1] == ESC_CONST && basbuf[i+2] == 1 && basbuf[i+3] == ESC_ENUM ){
    217                 int i2 = 0;
    218                 for(i+=4;;i2++,i++){
    219                     if(!IsVariableChar(basbuf[i])){
    220                         temporary[i2]=0;
    221                         break;
    222                     }
    223                     temporary[i2]=basbuf[i];
    224                     if(basbuf[i]=='\0') break;
    225                 }
    226                 Add( namespaceScopes, temporary, "Long", i );
    227             }
    228         }
    229 
    230         //次の行
    231         for(;;i++){
    232             if(IsCommandDelimitation(basbuf[i])) break;
    233         }
    234         if(basbuf[i]=='\0') break;
    235     }
    236 }
Note: See TracChangeset for help on using the changeset viewer.