Changeset 322 in dev


Ignore:
Timestamp:
Sep 24, 2007, 2:58:10 PM (16 years ago)
Author:
dai_9181
Message:

コンパイラ組み込みテンプレートエンジンを実装。
静的リンクライブラリ、デバッグ情報の内部形式をテキストからバイナリに変更した。

Location:
trunk/abdev
Files:
3 added
24 edited

Legend:

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

    r312 r322  
    13051305                    </File>
    13061306                    <File
     1307                        RelativePath="..\BasicCompiler_Common\src\Delegate.cpp"
     1308                        >
     1309                    </File>
     1310                    <File
    13071311                        RelativePath="..\BasicCompiler_Common\src\Exception.cpp"
    13081312                        >
     
    13341338                    <File
    13351339                        RelativePath="..\BasicCompiler_Common\src\ObjectModule.cpp"
     1340                        >
     1341                    </File>
     1342                    <File
     1343                        RelativePath="..\BasicCompiler_Common\src\Parameter.cpp"
    13361344                        >
    13371345                    </File>
     
    14781486                    </File>
    14791487                    <File
     1488                        RelativePath="..\BasicCompiler_Common\include\Delegate.h"
     1489                        >
     1490                    </File>
     1491                    <File
    14801492                        RelativePath="..\BasicCompiler_Common\include\Exception.h"
    14811493                        >
  • trunk/abdev/BasicCompiler32/MakePeHdr.cpp

    r308 r322  
    150150    SynonymErrorWords=(char **)HeapAlloc(hHeap,0,1);
    151151
    152     //列挙体に関する情報の初期化
     152    //列挙体に関する情報を収集
    153153    CEnumParent::InitEnum();
    154154
    155155    //列挙体からクラスコードを生成
    156156    char *temp;
    157     temp=CEnumParent::GenerateCodes();
     157    temp=CEnumParent::GenerateSourceCode();
    158158    AddSourceCode(temp);
    159159    HeapDefaultFree(temp);
     
    164164        compiler.GetObjectModule().meta.GetNamespaces()
    165165    );
     166
     167    // デリゲートに関する情報を収集
     168    {
     169        compiler.GetObjectModule().meta.GetDelegates().Collect(
     170            compiler.GetObjectModule().GetCurrentSource()
     171        );
     172        compiler.GetObjectModule().meta.GetDelegates().Iterator_Init();
     173
     174        // デリゲートからクラスコードを生成
     175        std::string tempSource;
     176        compiler.GetObjectModule().meta.GetDelegates().GenerateSourceCode( tempSource );
     177        AddSourceCode( tempSource.c_str() );
     178    }
    166179
    167180    //クラス名を取得(詳細情報はGetAllClassInfoで取得)
  • trunk/abdev/BasicCompiler32/stdafx.h

    r299 r322  
    11#pragma once
    22
     3#include <map>
    34#include <string>
    45#include <vector>
     
    1819
    1920#include <jenga/include/common/String.h>
     21#include <jenga/include/common/File.h>
    2022
    2123#include "../BasicCompiler_Common/common.h"
  • trunk/abdev/BasicCompiler64/BasicCompiler.vcproj

    r318 r322  
    340340                    </File>
    341341                    <File
     342                        RelativePath="..\BasicCompiler_Common\include\Delegate.h"
     343                        >
     344                    </File>
     345                    <File
    342346                        RelativePath="..\BasicCompiler_Common\include\Exception.h"
    343347                        >
     
    12841288                    </File>
    12851289                    <File
     1290                        RelativePath="..\BasicCompiler_Common\src\Delegate.cpp"
     1291                        >
     1292                    </File>
     1293                    <File
    12861294                        RelativePath="..\BasicCompiler_Common\src\Exception.cpp"
    12871295                        >
     
    13131321                    <File
    13141322                        RelativePath="..\BasicCompiler_Common\src\ObjectModule.cpp"
     1323                        >
     1324                    </File>
     1325                    <File
     1326                        RelativePath="..\BasicCompiler_Common\src\Parameter.cpp"
    13151327                        >
    13161328                    </File>
  • trunk/abdev/BasicCompiler64/MakePeHdr.cpp

    r318 r322  
    139139    SynonymErrorWords=(char **)HeapAlloc(hHeap,0,1);
    140140
    141     //列挙体に関する情報の初期化
     141    //列挙体に関する情報を収集
    142142    CEnumParent::InitEnum();
    143143
    144144    //列挙体からクラスコードを生成
    145145    char *temp;
    146     temp=CEnumParent::GenerateCodes();
     146    temp=CEnumParent::GenerateSourceCode();
    147147    AddSourceCode(temp);
    148148    HeapDefaultFree(temp);
     
    153153        compiler.GetObjectModule().meta.GetNamespaces()
    154154    );
     155
     156    // デリゲートに関する情報を収集
     157    {
     158        compiler.GetObjectModule().meta.GetDelegates().Collect(
     159            compiler.GetObjectModule().GetCurrentSource()
     160        );
     161        compiler.GetObjectModule().meta.GetDelegates().Iterator_Init();
     162
     163        // デリゲートからクラスコードを生成
     164        std::string tempSource;
     165        compiler.GetObjectModule().meta.GetDelegates().GenerateSourceCode( tempSource );
     166        AddSourceCode( tempSource.c_str() );
     167    }
    155168
    156169    //クラス名を取得(詳細情報はGetAllClassInfoで取得)
  • trunk/abdev/BasicCompiler64/stdafx.h

    r308 r322  
    11#pragma once
    22
     3#include <map>
    34#include <string>
    45#include <vector>
     
    1819
    1920#include <jenga/include/common/String.h>
     21#include <jenga/include/common/File.h>
    2022
    2123#include "../BasicCompiler_Common/common.h"
  • trunk/abdev/BasicCompiler_Common/BasicCompiler.cpp

    r312 r322  
    9090    MessageBox(0,temporary,"TestMessage",0);
    9191}
    92 void ts(char *msg){
     92void ts(const char *msg){
    9393    MessageBox(0,msg,"TestMessage",0);
    9494}
    95 void ts(char *msg,char *title){
     95void ts(const char *msg,const char *title){
    9696    MessageBox(0,msg,title,0);
    9797}
     
    207207    lstrcat(temporary,path+i);
    208208    lstrcpy(path,temporary);
     209}
     210std::string GetApplicationBaseFullPath( const std::string &relationalPath )
     211{
     212    char fullPath[1024];
     213    lstrcpy( fullPath, relationalPath.c_str() );
     214    GetFullPath( fullPath, Jenga::Common::Environment::GetAppDir() );
     215    return fullPath;
    209216}
    210217
  • trunk/abdev/BasicCompiler_Common/Compile.cpp

    r299 r322  
    181181                    // ローカル領域をコンパイルしているとき
    182182                    SetError(65,"TypeDef",cp );
     183                }
     184
     185                //既に収集済み
     186                break;
     187
     188            case ESC_DELEGATE:
     189                if( UserProc::IsLocalAreaCompiling() ){
     190                    // ローカル領域をコンパイルしているとき
     191                    SetError(65,"Delegate",cp );
    183192                }
    184193
  • trunk/abdev/BasicCompiler_Common/Enum.cpp

    r302 r322  
    168168}
    169169
    170 char *CEnumParent::GenerateCodes(void){
     170char *CEnumParent::GenerateSourceCode(void){
    171171    char *buffer;
    172172    int MaxSize,length;
  • trunk/abdev/BasicCompiler_Common/Enum.h

    r215 r322  
    3737    static void DestroyEnum(void);
    3838
    39     static char *GenerateCodes(void);
     39    static char *GenerateSourceCode(void);
    4040};
    4141extern CEnumParent **ppobj_EnumParent;
  • trunk/abdev/BasicCompiler_Common/Intermediate_Step1.cpp

    r294 r322  
    674674                        temporary[i2]=ESC_DEF;
    675675                    }
     676                    else if( lstrcmpi(temporary+i3,"Delegate")==0 )
     677                    {
     678                        i2=i3;
     679                        temporary[i2++]=1;
     680                        temporary[i2]=ESC_DELEGATE;
     681                    }
    676682                    break;
    677683                case 'e':
  • trunk/abdev/BasicCompiler_Common/Intermediate_Step2.cpp

    r290 r322  
    261261                KillStringSpaces(Command+2);
    262262                i2 = 2;
    263                 if( Command[i2] == 1 && Command[i2+1] == ESC_ENUM ){
     263                if( Command[i2] == 1 && Command[i2+1] == ESC_ENUM )
     264                {
    264265                    i2 += 2;
    265266                }
    266                 else if( memicmp( Command + i2, "Blittable(", 10 ) == 0 ){
     267                else if( Command[i2] == 1 && Command[i2+1] == ESC_DELEGATE )
     268                {
     269                    i2 += 2;
     270                }
     271                else if( memicmp( Command + i2, "Blittable(", 10 ) == 0 )
     272                {
    267273                    i2 += 10;
    268274                    i2 = JumpStringInPare(Command,i2)+1;
     
    316322            case ESC_NAMESPACE:
    317323            case ESC_IMPORTS:
     324            case ESC_DELEGATE:
    318325                KillStringSpaces(Command+2);
    319326                break;
  • trunk/abdev/BasicCompiler_Common/MakeExe.cpp

    r315 r322  
    1313}
    1414
    15 void AddSourceCode(char *buffer){
     15void AddSourceCode(const char *buffer){
    1616    char *temp;
    1717    temp=(char *)HeapAlloc(hHeap,0,lstrlen(buffer)+8192);
    1818    lstrcpy(temp,buffer);
     19
     20    // 改行コードをCRLFからLFにする
     21    ChangeReturnCode(temp);
     22
     23    // コメントを除去
     24    DeleteComment( temp );
    1925
    2026    //エスケープシーケンス設定
  • trunk/abdev/BasicCompiler_Common/common.h

    r316 r322  
    216216void ts(int i);
    217217void ts(int i,int i2);
    218 void ts(char *msg);
    219 void ts(char *msg,char *title);
     218void ts(const char *msg);
     219void ts(const char *msg,const char *title);
    220220void epi_check();
    221221void GetRelationalPath(char *path,char *dir);
    222222void GetFullPath( char *path, const string &baseDirPath );
     223std::string GetApplicationBaseFullPath( const std::string &relationalPath );
    223224void ShowErrorLine(int LineNum,const char *FileName);
    224225BOOL GetFilePathDialog(HWND hwnd,char *filename,LPSTR Filter,LPSTR Title,BOOL bOpen);
     
    273274//MakeExe.cpp
    274275void StepCompileProgress(void);
    275 void AddSourceCode(char *buffer);
     276void AddSourceCode(const char *buffer);
    276277void OutputExe(void);
    277278int MainThread(DWORD dummy);
  • trunk/abdev/BasicCompiler_Common/include/BoostSerializationSupport.h

    r279 r322  
    2828    bool WriteXmlString( std::string &xmlString ) const;
    2929
    30     bool ReadBinary( const std::string &filePath, bool isShowExceptionMessage = true );
    31     bool WriteBinary( const std::string &filePath, bool isShowExceptionMessage = true ) const;
     30    bool ReadBinaryFile( const std::string &filePath, bool isShowExceptionMessage = true );
     31    bool WriteBinaryFile( const std::string &filePath, bool isShowExceptionMessage = true ) const;
     32    bool ReadBinaryString( const std::string &binaryString );
     33    bool WriteBinaryString( std::string &binaryString ) const;
    3234
    3335    bool ReadText( const std::string &filePath, bool isShowExceptionMessage = true );
  • trunk/abdev/BasicCompiler_Common/include/Compiler.h

    r308 r322  
    88#include <ObjectModule.h>
    99#include <Linker.h>
     10#include <Delegate.h>
    1011
    1112class Compiler
  • trunk/abdev/BasicCompiler_Common/include/Meta.h

    r288 r322  
    1010#include <Variable.h>
    1111#include <Const.h>
     12#include <Delegate.h>
    1213
    1314class Meta
     
    4344    ProcPointers procPointers;
    4445
     46    // デリゲート
     47    Delegates delegates;
     48
    4549    // XMLシリアライズ用
    4650private:
     
    6064        ar & BOOST_SERIALIZATION_NVP( typeDefs );
    6165        ar & BOOST_SERIALIZATION_NVP( procPointers );
     66        ar & BOOST_SERIALIZATION_NVP( delegates );
    6267    }
    6368
     
    150155    }
    151156
    152     // 関数ポインタ
    153157    ProcPointers &GetProcPointers()
    154158    {
    155159        return procPointers;
    156160    }
     161
     162    Delegates &GetDelegates()
     163    {
     164        return delegates;
     165    }
    157166};
  • trunk/abdev/BasicCompiler_Common/include/Parameter.h

    r206 r322  
    144144        return (int)this->size() * PTR_SIZE;
    145145    }
     146
     147    bool Analyze( const char *sourceOfParams, int nowLine );
    146148};
  • trunk/abdev/BasicCompiler_Common/include/Source.h

    r308 r322  
    11#pragma once
    22
     3#include <map>
     4#include <string>
    35#include <vector>
    4 #include <string>
    56
    67#include <windows.h>
     
    202203    void RemoveReturnLineUnderbar();
    203204
     205    void Initialize( const std::string &source );
     206
    204207public:
    205208    BasicSource(){}
     
    209212    {
    210213    }
     214    BasicSource( const std::string &source )
     215    {
     216        Initialize( source );
     217    }
    211218    ~BasicSource(){}
    212219
     
    257264};
    258265typedef std::vector<BasicSource> BasicSources;
     266
     267class SourceTemplate
     268{
     269    std::string source;
     270public:
     271    SourceTemplate( const std::string &filePath );
     272    ~SourceTemplate()
     273    {
     274    }
     275
     276    std::string GetResult( const std::map<std::string,std::string> &values );
     277};
  • trunk/abdev/BasicCompiler_Common/src/BoostSerializationSupport.cpp

    r299 r322  
    190190}
    191191
    192 template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadBinary( const string &filePath, bool isShowExceptionMessage )
    193 {
    194     // 入力アーカイブの作成
    195     std::ifstream ifs( filePath.c_str() );
     192template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadBinaryFile( const string &filePath, bool isShowExceptionMessage )
     193{
     194    // 入力アーカイブの作成
     195    std::ifstream ifs( filePath.c_str(), ios::in | ios::binary );
    196196
    197197    bool isSuccessful = false;
     
    228228    return true;
    229229}
    230 template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteBinary( const string &filePath, bool isShowExceptionMessage ) const
    231 {
    232     // 出力アーカイブの作成
    233     std::ofstream ofs( filePath.c_str() );
     230template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteBinaryFile( const string &filePath, bool isShowExceptionMessage ) const
     231{
     232    // 出力アーカイブの作成
     233    std::ofstream ofs( filePath.c_str(), ios::out | ios::binary );
    234234
    235235    bool isSuccessful = false;
     
    267267}
    268268
     269template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadBinaryString( const std::string &binaryString )
     270{
     271    bool isSuccessful = false;
     272
     273    // 入力アーカイブの作成
     274    std::istringstream iss( binaryString, ios::in | ios::binary );
     275
     276    try{
     277        boost::archive::binary_iarchive ia(iss);
     278
     279        // 文字列ストリームから読込
     280        ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
     281
     282        isSuccessful = true;
     283    }
     284    catch( boost::archive::archive_exception e )
     285    {
     286        echo( e.what() );
     287    }
     288    catch(...){
     289        echo( "archive_exception以外の不明な例外" );
     290    }
     291
     292    return isSuccessful;
     293}
     294template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteBinaryString( std::string &binaryString ) const
     295{
     296    // 出力アーカイブの作成
     297    std::ostringstream oss( "", ios::out | ios::binary );
     298
     299    bool isSuccessful = false;
     300    try{
     301        boost::archive::binary_oarchive oa(oss);
     302
     303        // 文字列ストリームに書き出し
     304        oa << boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
     305
     306        isSuccessful = true;
     307    }
     308    catch( boost::archive::archive_exception e )
     309    {
     310        echo( e.what() );
     311    }
     312    catch(...){
     313        echo( "archive_exception以外の不明な例外" );
     314    }
     315
     316    binaryString = oss.str();
     317
     318    return isSuccessful;
     319}
     320
    269321template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadText( const string &filePath, bool isShowExceptionMessage )
    270322{
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r310 r322  
    957957
    958958            bool isEnum = false;
     959            bool isDelegate = false;
    959960            if( source[i] == 1 && source[i+1] == ESC_ENUM ){
    960961                // 列挙型の場合
    961962                isEnum = true;
    962963
    963                 i+=2;
     964                i += 2;
     965            }
     966            else if( source[i] == 1 && source[i+1] == ESC_DELEGATE )
     967            {
     968                // デリゲートの場合
     969                isDelegate = true;
     970
     971                i += 2;
    964972            }
    965973
     
    976984            if( pClass ){
    977985                if( source[nowLine+1] == ESC_CLASS ){
    978                     if( isEnum ){
     986                    if( isEnum )
     987                    {
    979988                        pClass->SetClassType( CClass::Enum );
     989                    }
     990                    else if( isDelegate )
     991                    {
     992                        pClass->SetClassType( CClass::Delegate );
    980993                    }
    981994                    else{
     
    13101323            }
    13111324
    1312             if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENUM ){
     1325            if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENUM )
     1326            {
    13131327                // 列挙型の場合
    1314                 i+=2;
     1328                i += 2;
     1329            }
     1330            else if( basbuf[i] == 1 && basbuf[i+1] == ESC_DELEGATE )
     1331            {
     1332                // デリゲートの場合
     1333                i += 2;
    13151334            }
    13161335
  • trunk/abdev/BasicCompiler_Common/src/ObjectModule.cpp

    r308 r322  
    99    ObjectModuleDataTypeBinaly,
    1010};
    11 const ObjectModuleDataType objectModuleDataType = ObjectModuleDataTypeText;
     11const ObjectModuleDataType objectModuleDataType = ObjectModuleDataTypeBinaly;
    1212
    1313
     
    4848        return ReadText( filePath );
    4949    case ObjectModuleDataTypeBinaly:
    50         return ReadBinary( filePath );
     50        return ReadBinaryFile( filePath );
    5151    default:
    5252        Jenga::Throw( "" );
     
    6464        return WriteText( filePath );
    6565    case ObjectModuleDataTypeBinaly:
    66         return WriteBinary( filePath );
     66        return WriteBinaryFile( filePath );
    6767    default:
    6868        Jenga::Throw( "" );
     
    8080        return ReadTextString( str );
    8181    case ObjectModuleDataTypeBinaly:
    82         Jenga::Throw( "" );
    83         break;
     82        return ReadBinaryString( str );
    8483    default:
    8584        Jenga::Throw( "" );
     
    9796        return WriteTextString( str );
    9897    case ObjectModuleDataTypeBinaly:
    99         Jenga::Throw( "" );
    100         break;
     98        return WriteBinaryString( str );
    10199    default:
    102100        Jenga::Throw( "" );
  • trunk/abdev/BasicCompiler_Common/src/Procedure.cpp

    r311 r322  
    5555    //ソースコードの位置
    5656    this->codePos = nowLine;
     57    if( nowLine == 0x10b )
     58    {
     59        int test=0;
     60    }
    5761
    5862    //パラメータ
  • trunk/abdev/BasicCompiler_Common/src/Source.cpp

    r305 r322  
    422422    int i,i2;
    423423
     424    bool isMustChange = false;
     425    for( i=0; ; i++ ){
     426        if( buffer[i] == '\0' ){
     427            break;
     428        }
     429        if( buffer[i]=='\n' )
     430        {
     431            if( i>0 )
     432            {
     433                if( buffer[i-1] == '\r' )
     434                {
     435                    isMustChange = true;
     436                }
     437            }
     438        }
     439    }
     440
     441    if( !isMustChange )
     442    {
     443        // 改行コードの変換は必要ない
     444        return;
     445    }
     446
    424447#ifdef _DEBUG
    425448    //改行コードの整合性チェック
     
    806829}
    807830
     831void BasicSource::Initialize( const std::string &source )
     832{
     833    Clear();
     834    Add( source );
     835
     836    // 改行コードをCRLFからLFに変換
     837    ChangeReturnLineChar();
     838
     839    // コメントを削除
     840    RemoveComments();
     841
     842    //最終行には文字を含ませないようにする
     843    if( lstrlen(buffer)>0 && buffer[lstrlen(buffer)-1] != '\n' )
     844    {
     845        Realloc( length + 1 );
     846        lstrcat( buffer, "\n" );
     847    }
     848
     849    // アンダーバーによる改行を正規表現に戻す
     850    RemoveReturnLineUnderbar();
     851}
     852
    808853void BasicSource::SetBuffer( const char *buffer ){
    809854    this->buffer = (char *)calloc( lstrlen(buffer) + 1, 1 );
     
    9871032    return 1;
    9881033}
     1034
     1035
     1036SourceTemplate::SourceTemplate( const std::string &filePath )
     1037{
     1038    Jenga::Common::File file = Jenga::Common::File( GetApplicationBaseFullPath( filePath ) );
     1039    source = file.Read();
     1040}
     1041std::string SourceTemplate::GetResult( const std::map<std::string,std::string> &values )
     1042{
     1043    std::string result = source;
     1044
     1045    std::map<std::string,std::string>::const_iterator it = values.begin();
     1046    while( it != values.end() )
     1047    {
     1048        while( true )
     1049        {
     1050            std::string::size_type index = result.find( "#" + it->first + "#" );
     1051            if( index == std::string::npos )
     1052            {
     1053                break;
     1054            }
     1055
     1056            result = result.substr( 0, index ) + it->second + result.substr( index + it->first.length() + 2 );
     1057        }
     1058        it++;
     1059    }
     1060
     1061    return result;
     1062}
Note: See TracChangeset for help on using the changeset viewer.