小女也愛葵花寶典---讀懂編譯原理(1)


  欲練神功,必先看數據結構(圖必看),內功心法之葵花寶典 最近在看葵花寶典(編譯原理),買了本龍書來看,但是怎么看也看不明白,之后小女我先照的自己的想法寫了一次,然后寫的時候見的問題,在書中都可以找的到,這樣我就看懂龍書了.在此寫點東西給大家參考.

 

先看看什么是狀態機,上圖就是狀態機

解答上圖:識別一個字符串 I am a boy 首先是狀態-是否是空格,然后是-是否是新的單詞,只要這兩種狀態就行了.用兩個指針    char* lexemBegin    char* lexemEnd 指向單詞的開始:   

    I          am       a        boy

    ↑         ↑

  lexemBegin    lexemEnd

 

然后用指針, lexemEnd讀取一個字符,如讀I,然后狀態 是否是新的單詞=是 ,讀空格 是否是空格=是,然后就可以判定一個單詞的結束.

以上是原理:然后給出代碼

typedef struct scrWord

{//這是一個單詞表,之后還要用在語義分析

    char data[100];

    int len;

    scrWord* next;

    scrWord* S;//非中終符

}scrWord;

void cpystr(char* des ,char* scr,int len)

{   

for(int i=0;i<len;i++)

    {

        *des=*scr;

        des++;

        scr++;

    }

}

bool cmptostr(char* scr ,char* lexemBegin ,int len)

{//單詞比較,這里先自己寫着行,之后用kmp 算法替換(這樣速度快)

 

    for(int i=0;i<len;i++)

    {

        if(tolower(*scr)!=tolower(*lexemBegin))

            return false;

        lexemBegin++;

        scr++;

    }

    return true;

}

void toker(char* cinput ,scrWord *wordTable)

{// cinput輸入的單詞, wordTable單詞表之后講解

    int Wordlen=strlen(cinput);//得到輸入串的長度

    scrWord *lpWordTable=wordTable;

    char* lexemBegin=cinput;//串的開始指針

    char* lexemEnd=cinput; //串的結束指針

    bool isNewWord=false;//是否是新詞單

    bool isBreak=true;//是否是空格

    int count=0;//記錄一共有幾個單

    while(*lexemEnd!=';')

    {

        if((*(lexemEnd-1))!=' ' &&  (*lexemEnd==' ' || *lexemEnd=='(' || *lexemEnd==')'))//這里之后會改進

            isNewWord=true;//

        else

            isNewWord=false;

        if((*lexemEnd==' ' || *lexemEnd=='(' || *lexemEnd==')') && isNewWord==true)

        {

            scrWord *wordTable2=new scrWord();//單詞表

            memset(wordTable2->data,0,100);//內存初始化

            cpystr(wordTable2->data,lexemBegin,lexemEnd-lexemBegin);//單詞表

            lpWordTable->next=wordTable2;//用鏈表生成的單詞表

            lpWordTable->len=lexemEnd-lexemBegin;// 單詞長度

            lpWordTable=lpWordTable->next;

            lexemBegin=lexemEnd;

        }

        lexemEnd++;

        if(lexemEnd-lexemBegin>Wordlen)

        {

            return;

        }

    }

}

 

int main(int argc, char* argv[])

{//調用的例子

    scrWord *wordTable=new scrWord();

    char * str="create table hts(fe int)";

    toker(str,wordTable);

     return 0;

}

 

 

這上為自己寫的sql詞法分析器,在之后小女將出繼編改進詞法分析器,並對照龍書.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM