Changeset 400 in dev for trunk


Ignore:
Timestamp:
Feb 27, 2008, 5:21:00 PM (16 years ago)
Author:
dai_9181
Message:

LexicalAnalysis.cppを除去した

Location:
trunk/abdev
Files:
1 added
5 edited

Legend:

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

    r376 r400  
    516516                    </FileConfiguration>
    517517                </File>
     518                <File
     519                    RelativePath="..\BasicCompiler_Common\StrOperation.h"
     520                    >
     521                </File>
    518522                <Filter
    519523                    Name="Intermediate"
  • trunk/abdev/BasicCompiler64/BasicCompiler.vcproj

    r377 r400  
    10731073                    >
    10741074                </File>
     1075                <File
     1076                    RelativePath="..\BasicCompiler_Common\StrOperation.h"
     1077                    >
     1078                </File>
    10751079                <Filter
    10761080                    Name="Intermediate"
  • trunk/abdev/BasicCompiler_Common/StrOperation.cpp

    r387 r400  
    505505    }
    506506}
     507
     508
     509bool IsVariableTopChar(char c){
     510    if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||c=='_')
     511    {
     512        return true;
     513    }
     514    return false;
     515}
     516bool IsVariableChar( char c, bool isGenericsChars ){
     517    if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9')||
     518        c=='%'||c=='!'||c=='#'||c=='$'||
     519        c=='_'||c=='.')
     520    {
     521        return true;
     522    }
     523
     524    if( isGenericsChars )
     525    {
     526        if( c == '<' || c == '>' )
     527        {
     528            return true;
     529        }
     530    }
     531
     532    return false;
     533}
     534bool IsBlank(char c){
     535    if(c==' '||c=='\t') return 1;
     536    return 0;
     537}
     538int GetOneParameter(const char *Parameter,int pos,char *retAns){
     539    int i,i2,i3,IsStr;
     540    for(i=pos,i2=0,IsStr=0;;i++,i2++){
     541        if(Parameter[i]=='\"') IsStr^=1;
     542        else if(Parameter[i]=='('&&IsStr==0){
     543            i3=GetStringInPare(retAns+i2,Parameter+i);
     544            i+=i3-1;
     545            i2+=i3-1;
     546            continue;
     547        }
     548        else if(Parameter[i]=='['&&IsStr==0){
     549            i3=GetStringInBracket(retAns+i2,Parameter+i);
     550            i+=i3-1;
     551            i2+=i3-1;
     552            continue;
     553        }
     554        else if(Parameter[i]==','&&IsStr==0){
     555            retAns[i2]=0;
     556            i++;
     557            break;
     558        }
     559
     560        if(IsCommandDelimitation(Parameter[i])&&IsStr==0
     561            || Parameter[i] == ')' && IsStr == 0 ){
     562                retAns[i2]=0;
     563                break;
     564        }
     565
     566        retAns[i2]=Parameter[i];
     567    }
     568    return i;
     569}
     570int JumpOneParameter(char *Parameter,int i){
     571    int i2,IsStr;
     572    for(i2=0,IsStr=0;;i++,i2++){
     573        if(Parameter[i]=='\"') IsStr^=1;
     574        else if(Parameter[i]=='('&&IsStr==0){
     575            i=JumpStringInPare(Parameter,i+1);
     576            continue;
     577        }
     578        else if(Parameter[i]=='['&&IsStr==0){
     579            i=JumpStringInBracket(Parameter,i+1);
     580            continue;
     581        }
     582        else if(Parameter[i]==','&&IsStr==0){
     583            i++;
     584            break;
     585        }
     586        if(IsCommandDelimitation(Parameter[i])) break;
     587    }
     588    return i;
     589}
     590int GetStringInQuotation(char *buffer,char *ReadBuffer){
     591    int i;
     592
     593    if(ReadBuffer[0]=='\"'){
     594        buffer[0]=ReadBuffer[0];
     595        i=1;
     596    }
     597    else i=0;
     598
     599    for(;;i++){
     600        buffer[i]=ReadBuffer[i];
     601        if(IsDBCSLeadByte(ReadBuffer[i])){
     602            i++;
     603            buffer[i]=ReadBuffer[i];
     604            continue;
     605        }
     606        if(ReadBuffer[i]=='\"'){
     607            i++;
     608            buffer[i]=0;
     609            break;
     610        }
     611        if(ReadBuffer[i]=='\0') return 0;
     612    }
     613    return i;
     614}
     615int GetStringInPare( char *buffer, const char *ReadBuffer, bool isRemovePare ){
     616    int i,IsStr,PareNum;
     617    for(i=0,IsStr=0,PareNum=0;;i++){
     618        buffer[i]=ReadBuffer[i];
     619        if(IsDBCSLeadByte(ReadBuffer[i])){
     620            i++;
     621            buffer[i]=ReadBuffer[i];
     622            continue;
     623        }
     624        if(ReadBuffer[i]=='\"') IsStr^=1;
     625        else if(ReadBuffer[i]=='('&&IsStr==0) PareNum++;
     626        else if(ReadBuffer[i]==')'&&IsStr==0){
     627            PareNum--;
     628            if(PareNum==0){
     629                i++;
     630                buffer[i]=0;
     631                break;
     632            }
     633        }
     634        else if(ReadBuffer[i]=='\0') return 0;
     635    }
     636
     637    if( isRemovePare )
     638    {
     639        RemoveStringPare( buffer );
     640    }
     641
     642    return i;
     643}
     644int GetStringInBracket(char *buffer,const char *ReadBuffer){
     645    int i,IsStr,PareNum;
     646    for(i=0,IsStr=0,PareNum=0;;i++){
     647        buffer[i]=ReadBuffer[i];
     648        if(IsDBCSLeadByte(ReadBuffer[i])){
     649            i++;
     650            buffer[i]=ReadBuffer[i];
     651            continue;
     652        }
     653        if(ReadBuffer[i]=='\"') IsStr^=1;
     654        else if(ReadBuffer[i]=='['&&IsStr==0) PareNum++;
     655        else if(ReadBuffer[i]==']'&&IsStr==0){
     656            PareNum--;
     657            if(PareNum==0){
     658                i++;
     659                buffer[i]=0;
     660                break;
     661            }
     662        }
     663        else if(ReadBuffer[i]=='\0') return 0;
     664    }
     665    return i;
     666}
     667int GetStringInGenericBracket(char *buffer,const char *ReadBuffer){
     668    int i,IsStr,PareNum;
     669    for(i=0,IsStr=0,PareNum=0;;i++){
     670        buffer[i]=ReadBuffer[i];
     671        if(IsDBCSLeadByte(ReadBuffer[i])){
     672            i++;
     673            buffer[i]=ReadBuffer[i];
     674            continue;
     675        }
     676        if(ReadBuffer[i]=='\"') IsStr^=1;
     677        else if(ReadBuffer[i]=='<'&&IsStr==0) PareNum++;
     678        else if(ReadBuffer[i]=='>'&&IsStr==0){
     679            PareNum--;
     680            if(PareNum==0){
     681                i++;
     682                buffer[i]=0;
     683                break;
     684            }
     685        }
     686        else if(ReadBuffer[i]=='\0') return 0;
     687    }
     688    return i;
     689}
     690int JumpStringInPare(const char *buffer,int pos){
     691    int PareNum;
     692    for(PareNum=1;;pos++){
     693        if(buffer[pos]=='\"'){
     694            for(pos++;;pos++){
     695                if(buffer[pos]=='\"') break;
     696            }
     697            continue;
     698        }
     699        else if(buffer[pos]=='(') PareNum++;
     700        else if(buffer[pos]==')'){
     701            PareNum--;
     702            if(PareNum==0) return pos;
     703        }
     704        else if(buffer[pos]=='\0') break;
     705    }
     706    return 0;
     707}
     708int JumpStringInBracket(const char *buffer,int pos){
     709    int PareNum;
     710    for(PareNum=1;;pos++){
     711        if(buffer[pos]=='\"'){
     712            for(pos++;;pos++){
     713                if(buffer[pos]=='\"') break;
     714            }
     715            continue;
     716        }
     717        else if(buffer[pos]=='[') PareNum++;
     718        else if(buffer[pos]==']'){
     719            PareNum--;
     720            if(PareNum==0) return pos;
     721        }
     722        else if(buffer[pos]=='\0') break;
     723    }
     724    return 0;
     725}
     726bool IsCommandDelimitation( char c ){
     727    if( c == '\n' || c == ':' || c == '\0' ){
     728        return true;
     729    }
     730
     731    return false;
     732}
     733
     734int GetStringInPare_RemovePare(char *buffer,const char *ReadBuffer){
     735    int i,IsStr,PareNum;
     736    for(i=0,IsStr=0,PareNum=1;;i++){
     737        buffer[i]=ReadBuffer[i];
     738        if(IsDBCSLeadByte(ReadBuffer[i])){
     739            i++;
     740            buffer[i]=ReadBuffer[i];
     741            continue;
     742        }
     743        if(ReadBuffer[i]=='\"') IsStr^=1;
     744        else if(ReadBuffer[i]=='('&&IsStr==0) PareNum++;
     745        else if(ReadBuffer[i]==')'&&IsStr==0){
     746            PareNum--;
     747            if(PareNum==0){
     748                buffer[i]=0;
     749                break;
     750            }
     751        }
     752        else if(ReadBuffer[i]=='\0') return 0;
     753    }
     754    return i;
     755}
     756
     757void SplitParameter( const std::string &src, Jenga::Common::Strings &dests, bool isClear )
     758{
     759    const char *buffer = src.c_str();
     760    int i = 0;
     761
     762    if( isClear )
     763    {
     764        dests.clear();
     765    }
     766
     767    while( buffer[i] )
     768    {
     769        char result[8192];
     770        i = GetOneParameter( buffer, i, result );
     771        dests.push_back( result );
     772    }
     773}
     774
     775
     776bool SplitMemberName( const char *desc, char *object, char *member, ReferenceKind &refType ){
     777    int lastIndex = -1;
     778    for( int i=0; desc[i]; i++ ){
     779        if( desc[i] == '(' ){
     780            i=JumpStringInPare(desc,i+1);
     781            continue;
     782        }
     783        else if( desc[i] == '[' ){
     784            i=JumpStringInBracket(desc,i+1);
     785            continue;
     786        }
     787        else if(desc[i]=='.'||(desc[i]==1&&desc[i+1]==ESC_PSMEM)){
     788            lastIndex = i;
     789        }
     790    }
     791    if( lastIndex == -1 ){
     792        if( object )
     793        {
     794            object[0] = 0;
     795        }
     796        lstrcpy( member, desc );
     797        return false;
     798    }
     799
     800    if(desc[lastIndex]=='.'){
     801        lstrcpy(member,desc+lastIndex+1);
     802        refType = RefDot;
     803    }
     804    else{
     805        lstrcpy(member,desc+lastIndex+2);
     806        refType = RefPointer;
     807    }
     808
     809    if( object ){
     810        lstrcpy( object, desc );
     811        object[lastIndex]=0;
     812    }
     813
     814    return true;
     815}
     816bool SplitMemberName( const char *desc, char *object, char *member ){
     817    ReferenceKind dummyRefType;
     818    return SplitMemberName( desc, object, member, dummyRefType );
     819}
     820
     821void SplitSyntacticForAs( const char *src, char *varName, char *typeName)
     822{
     823    int i = 0;
     824    for( ; ; i++ )
     825    {
     826        if( src[i] == '\0' || src[i] == 1 && src[i+1] == ESC_AS )
     827        {
     828            varName[i] = 0;
     829            break;
     830        }
     831        varName[i] = src[i];
     832    }
     833
     834    if( src[i] )
     835    {
     836        lstrcpy( typeName, src + i + 2 );
     837    }
     838    else
     839    {
     840        typeName[i] = 0;
     841    }
     842}
     843
     844char *calcNames[255] = {
     845    "xor",
     846};
     847void InitCalcNames()
     848{
     849    if( calcNames[CALC_XOR] )
     850    {
     851        return;
     852    }
     853
     854    memset( calcNames, 0, 255 * sizeof(char *) );
     855    calcNames[CALC_XOR] = "xor";
     856    calcNames[CALC_OR] = "or";
     857    calcNames[CALC_AND] = "and";
     858    calcNames[CALC_NOT] = "Not";
     859    calcNames[CALC_PE] = "<=";
     860    calcNames[CALC_QE] = ">=";
     861    calcNames[CALC_NOTEQUAL] = "<>";
     862    calcNames[CALC_EQUAL] = "=(compare)";
     863    calcNames[CALC_P] = "<";
     864    calcNames[CALC_Q] = ">";
     865    calcNames[CALC_SHL] = "<<";
     866    calcNames[CALC_SHR] = ">>";
     867    calcNames[CALC_ADDITION] = "+";
     868    calcNames[CALC_SUBTRACTION] = "-";
     869    calcNames[CALC_STRPLUS] = "&";
     870    calcNames[CALC_MOD] = "mod";
     871    calcNames[CALC_PRODUCT] = "*";
     872    calcNames[CALC_QUOTIENT] = "/";
     873    calcNames[CALC_INTQUOTIENT] = "\\";
     874    calcNames[CALC_AS] = "As";
     875    calcNames[CALC_BYVAL] = "ByVal";
     876    calcNames[CALC_MINUSMARK] = "-(mark)";
     877    calcNames[CALC_POWER] = "^";
     878    calcNames[CALC_SUBSITUATION] = "=";
     879    calcNames[CALC_ARRAY_GET] = "[]";
     880    calcNames[CALC_ARRAY_SET] = "[]=";
     881}
     882void GetCalcName(int idCalc,char *name){
     883    InitCalcNames();
     884
     885    if( calcNames[idCalc] == NULL )
     886    {
     887        SetError();
     888    }
     889    lstrcpy( name, calcNames[idCalc] );
     890}
     891BYTE ToCalcId( const char *name )
     892{
     893    InitCalcNames();
     894
     895    for( int i=0; i<255; i++ )
     896    {
     897        if( calcNames[i] )
     898        {
     899            if( lstrcmp( name, calcNames[i] ) == 0 )
     900            {
     901                return i;
     902            }
     903        }
     904    }
     905    SetError();
     906    return 0;
     907}
     908
     909std::string Operator_NaturalStringToCalcMarkString( const std::string &name )
     910{
     911    if( name[0] == 1 && name[1] == ESC_OPERATOR )
     912    {
     913        BYTE calcId = ToCalcId( name.c_str()+2 );
     914        char temporary[255];
     915        temporary[0] = name[0];
     916        temporary[1] = name[1];
     917        temporary[2] = calcId;
     918        temporary[3] = 0;
     919        return temporary;
     920    }
     921    return name;
     922}
     923std::string Operator_CalcMarkStringToNaturalString( const std::string &name )
     924{
     925    if( name[0] == 1 && name[1] == ESC_OPERATOR )
     926    {
     927        BYTE calcId = name[2];
     928        char temporary[255], calcName[255];
     929        GetCalcName( calcId, calcName );
     930        temporary[0] = name[0];
     931        temporary[1] = name[1];
     932        lstrcpy( temporary+2, calcName );
     933        return temporary;
     934    }
     935    return name;
     936}
     937
     938bool IsGenericTypeSourcePart( const char *buffer )
     939{
     940    if( buffer[0] != '<' )
     941    {
     942        Jenga::Throw( "意図しない文字列に対してIsGenericTypeSourcePart関数が呼ばれた" );
     943        return false;
     944    }
     945
     946    int i=1, scopeCount=1;
     947    for( ; ; i++ )
     948    {
     949        if( buffer[i] == '\0' )
     950        {
     951            break;
     952        }
     953        if( buffer[i] == '<' )
     954        {
     955            scopeCount++;
     956        }
     957        else if( buffer[i] == '>' )
     958        {
     959            scopeCount--;
     960
     961            if( scopeCount == 0 )
     962            {
     963                break;
     964            }
     965        }
     966    }
     967
     968    if( buffer[i] != '>' )
     969    {
     970        return false;
     971    }
     972
     973
     974    /////////////////////////////////////////////////////////////////
     975    // '>'に続く文字を判定する
     976    /////////////////////////////////////////////////////////////////
     977
     978    i++;
     979    while( IsBlank( buffer[i] ) )
     980    {
     981        i++;
     982    }
     983
     984    if( IsVariableChar( buffer[i] ) )
     985    {
     986        return false;
     987    }
     988
     989    return true;
     990}
  • trunk/abdev/BasicCompiler_Common/common.h

    r393 r400  
    205205
    206206#include "../BasicCompiler_Common/PESchedule.h"
     207#include "../BasicCompiler_Common/StrOperation.h"
    207208#include "../BasicCompiler_Common/VariableOpe.h"
    208209
  • trunk/abdev/BasicCompiler_Common/src/Procedure.cpp

    r397 r400  
    110110        }
    111111    }
     112
     113    /*
     114    GetStringInPare( temporary, sourceOfParams + i );
     115    RemoveStringPare( temporary );
     116    */
     117
    112118    while(1){
    113119        if(sourceOfParams[i]==')') break;
Note: See TracChangeset for help on using the changeset viewer.