0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在main函數(shù)中運(yùn)行的自動(dòng)機(jī)

冬至子 ? 來源:趙同學(xué)的代碼時(shí)間 ? 作者:Jun. ? 2023-05-23 11:18 ? 次閱讀

有了前文中的積木,繼續(xù)實(shí)現(xiàn)一個(gè)詞法分析器就不再困難。

先回顧一下各個(gè)模塊:

然后我們試圖將他們組裝起來,因?yàn)橐婚_始實(shí)現(xiàn)的都是零件(子函數(shù))部分,本文主要介紹在main函數(shù)中運(yùn)行的自動(dòng)機(jī)。

還記得-1篇中的DFA嗎?

圖片

經(jīng)過第0篇,以及滿足題目要求,我們最終的DFA應(yīng)該是這樣:

圖片

流程大致為:

圖片

按照以上思路,經(jīng)過不斷地調(diào)試完善,主函數(shù)設(shè)計(jì)為:

int main()
{
    initialize();
    string tmp;
    char c;
    while((c = getchar()) != EOF)
    {
        if(isspace(c)) // 忽略空白
            continue;


        if(isdigit(c)) // 如果是數(shù)字開頭
        {
            ungetc(c, stdin);
            cout << "DIGIT : " << num() << endl;
            continue;
        }


        char peek;
        peek = getchar(); // 一步提前量
        if((c == '+' || c == '-') && isdigit(peek)) //輸入帶符號(hào)數(shù)
        {
            ungetc(peek, stdin);
            ungetc(c, stdin);
            cout << "DIGIT : " << num() << endl;
            continue;
        }

        if(c == '/' && peek == '*') //輸入注釋
        {
            cout << "COMMENTS : /*" << comments() << endl;
            continue;
        }
        int tkn = 0;
        string s;
        if(!isalnum(c)) // 輸入c為專用符號(hào)
        {
            s += c;
            if(peek == '=') // 所定義的雙目運(yùn)算符中第二個(gè)只有 = 可以偷懶;
                s += peek;
            else ungetc(peek, stdin);
            tkn = query(s);
        }
        if(!tkn){  // 若不是專用符號(hào)開頭,即為字母開頭
            ungetc(peek, stdin);
            s += c;
            while((c = getchar()) != EOF) // 讀入這一串字母
            {
                if(isspace(c)) break;
                if(isalnum(c) || c == '_')
                    s += c;
                else{
                    ungetc(c, stdin);
                    break;
                }
            }
            tkn = query(s); // 查詢token
        }
        switch (tkn) // 依據(jù)token打印
        {
        case 1:
            cout << "KEYWORD : " << s << endl;
            break;
        case 2:
            cout << "BASIC : " << s << endl;
            break;
        case 3:
            cout << "IDENTITY : " << s << endl;
            break;
        case 5:
            cout << "SYMBOL : " << s << endl;
            break;

        default:
            break;
        }


    }
    return 0;
}

測試

使用測試樣例1:

{  /* An example */
    int i,j; float x; float[100] a;
    while ( true) {
      do i = i + 1; while ( a[i] < x);
    if ( i >= j ) break;
    x = a[i];
      }
    }

輸出結(jié)果:

// line 1   {  /* An example */
SYMBOL : {
COMMENTS : /* An example */


// line 2   int i,j; float x; float[100] a;
BASIC : int
IDENTITY : i
SYMBOL : ,
IDENTITY : j
SYMBOL : ;
BASIC : float
IDENTITY : x
SYMBOL : ;
BASIC : float
SYMBOL : [
DIGIT : 100
SYMBOL : ]
IDENTITY : a
SYMBOL : ;


// line 3   while ( true) {
KEYWORD : while
SYMBOL : (
KEYWORD : true
SYMBOL : )
SYMBOL : {


// line 4  do i = i + 1; while ( a[i] < x);
KEYWORD : do
IDENTITY : i
SYMBOL : =
IDENTITY : i
SYMBOL : +
DIGIT : 1
SYMBOL : ;
KEYWORD : while
SYMBOL : (
IDENTITY : a
SYMBOL : [
IDENTITY : i
SYMBOL : ]
SYMBOL : <
IDENTITY : x
SYMBOL : )
SYMBOL : ;


// line 5   if ( i >= j ) break;
KEYWORD : if
SYMBOL : (
IDENTITY : i
SYMBOL : >=
IDENTITY : j
SYMBOL : )
KEYWORD : break
SYMBOL : ;


// line 6   x = a[i];
IDENTITY : x
SYMBOL : =
IDENTITY : a
SYMBOL : [
IDENTITY : i
SYMBOL : ]
SYMBOL : ;


// line 7   }
SYMBOL : }

// line 8   }
SYMBOL : }

可以發(fā)現(xiàn)輸出結(jié)果是完全正確的。

測試樣例2:測試數(shù)字

+1212.551e1589

輸出:

DIGIT : +1212.551e1589

好,到此,我們就完成了本次實(shí)驗(yàn)任務(wù),一個(gè)簡單的詞法分析器的設(shè)計(jì),在設(shè)計(jì)過程中,我們使用到了Trie樹這一數(shù)據(jù)結(jié)構(gòu),使得代碼變得美觀了許多,同時(shí),針對較為復(fù)雜的數(shù)字讀取行為,我們設(shè)計(jì)了一個(gè)DFA確定的有限狀態(tài)自動(dòng)機(jī)完成,最終,我們在main函數(shù)中,將他們拼接起來,就形成了最后的詞法分析器,整個(gè)實(shí)驗(yàn)用時(shí)半天,整體思想并不難理解,相信大家如果從頭看到此處應(yīng)該邏輯會(huì)相當(dāng)清晰。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    光電傳感器輕工自動(dòng)機(jī)上有哪些應(yīng)用?

    請問一下,光電傳感器輕工自動(dòng)機(jī)上有哪些應(yīng)用?
    發(fā)表于 05-08 08:58

    LabVIEW 生命小游戲 元胞自動(dòng)機(jī)

    生命小游戲,又叫元胞自動(dòng)機(jī),一個(gè)令人著迷的圖靈完備系統(tǒng)參考資料:https://zhuanlan.zhihu.com/p/347305597https://www.zhihu.com
    發(fā)表于 02-12 18:33

    NFA→FA→GFA自動(dòng)機(jī)轉(zhuǎn)換算法

    研究了不確定有窮自動(dòng)機(jī)NFA、確定有窮自動(dòng)機(jī)FA、規(guī)范有窮自動(dòng)機(jī)GFA的基本關(guān)系與等價(jià)轉(zhuǎn)換;給出了“NFA→FA”等價(jià)轉(zhuǎn)換算法與“FA→GFA”等價(jià)轉(zhuǎn)換算法,構(gòu)造性證明了從FA到GFA的存
    發(fā)表于 12-10 17:25 ?14次下載

    加性細(xì)胞自動(dòng)機(jī)的同構(gòu)性分析

    根據(jù)矩陣方程理論和細(xì)胞自動(dòng)機(jī)原理,提出了加性細(xì)胞自動(dòng)機(jī)狀態(tài)轉(zhuǎn)移結(jié)構(gòu)的同構(gòu)性方法,該方法利用狀態(tài)轉(zhuǎn)移矩陣方程及其特征多項(xiàng)式分析規(guī)則90和150加性細(xì)胞自動(dòng)機(jī),證明了特
    發(fā)表于 02-28 17:03 ?35次下載

    [自動(dòng)機(jī)自動(dòng)線].李紹炎.掃描版

    本書結(jié)合目前國內(nèi)自動(dòng)機(jī)械行業(yè)的現(xiàn)狀,從應(yīng)用的角度系統(tǒng)介紹了自動(dòng)機(jī)械的模塊化結(jié)構(gòu)及工作原理、設(shè)計(jì)選型方法、裝配調(diào)試及維護(hù)要領(lǐng)等。主要內(nèi)容包括:自動(dòng)機(jī)械的結(jié)構(gòu)組成、輸
    發(fā)表于 09-17 16:02 ?0次下載

    基于元胞自動(dòng)機(jī)的混合交通流模型的研究

    文章介紹了元胞自動(dòng)機(jī)交通流模型的應(yīng)用,具有較好的參考價(jià)值
    發(fā)表于 06-17 16:00 ?0次下載

    元胞自動(dòng)機(jī)的介紹資料

    元胞自動(dòng)機(jī)的介紹資料,僅供參考和學(xué)習(xí),不得用作商業(yè)用途。
    發(fā)表于 06-24 17:01 ?3次下載

    自動(dòng)機(jī)械設(shè)計(jì)

    自動(dòng)機(jī)械設(shè)計(jì)》以自動(dòng)機(jī)械的四大結(jié)構(gòu)組成部分為主要內(nèi)容展開,深入闡述了自動(dòng)機(jī)械設(shè)計(jì)普遍性的理論問題。例舉實(shí)例
    發(fā)表于 08-02 08:54 ?0次下載

    異步多進(jìn)程時(shí)間自動(dòng)機(jī)的可覆蓋性問題

    已有的實(shí)時(shí)系統(tǒng)模型無法動(dòng)態(tài)創(chuàng)建新進(jìn)程.為此,基于時(shí)間自動(dòng)機(jī)模型,提出了異步多進(jìn)程時(shí)間自動(dòng)機(jī)模型,將每個(gè)進(jìn)程抽象為進(jìn)程時(shí)間自動(dòng)機(jī),其部分狀態(tài)能夠觸發(fā)新進(jìn)程,考慮到隊(duì)列會(huì)導(dǎo)致模型圖靈完備,進(jìn)程都被緩存
    發(fā)表于 12-29 14:10 ?0次下載

    基于統(tǒng)計(jì)的AC自動(dòng)機(jī)空間優(yōu)化

    基于訪問頻率、訪問層次以及結(jié)合上述2種特征對AC自動(dòng)機(jī)的部分節(jié)點(diǎn)實(shí)現(xiàn)完全化的算法。Snort、ClamAV、URL等真實(shí)數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果表明,HybridFA算法的存儲(chǔ)空間低于高級(jí)AC自動(dòng)機(jī)的5%。此外,結(jié)合訪問頻率和訪問層
    發(fā)表于 03-13 16:47 ?0次下載
    基于統(tǒng)計(jì)的AC<b class='flag-5'>自動(dòng)機(jī)</b>空間優(yōu)化

    自動(dòng)機(jī)器學(xué)習(xí)簡述

    自動(dòng)機(jī)器學(xué)習(xí)(AutoML)的目標(biāo)就是使用自動(dòng)化的數(shù)據(jù)驅(qū)動(dòng)方式來做出上述的決策。用戶只要提供數(shù)據(jù),自動(dòng)機(jī)器學(xué)習(xí)系統(tǒng)自動(dòng)的決定最佳的方案。領(lǐng)域?qū)<也辉傩枰鄲烙趯W(xué)習(xí)各種機(jī)器學(xué)習(xí)的算法。
    的頭像 發(fā)表于 12-26 10:56 ?880次閱讀

    自動(dòng)機(jī)終結(jié)字查找算法實(shí)現(xiàn)優(yōu)化綜述

    自動(dòng)機(jī)的秩與工業(yè)自動(dòng)的部件定向器設(shè)計(jì)問題和理論計(jì)算機(jī)科學(xué)的 Cerny-pin猜想密切相關(guān)。計(jì)算自動(dòng)機(jī)的秩可以歸結(jié)于查找
    發(fā)表于 04-28 15:49 ?3次下載
    <b class='flag-5'>自動(dòng)機(jī)</b>終結(jié)字查找算法實(shí)現(xiàn)優(yōu)化綜述

    基于Arduino和OLED的元胞自動(dòng)機(jī)

    該項(xiàng)目使用I2C 128×64 OLED顯示由Arduino Nano供電的微型細(xì)胞自動(dòng)機(jī)
    發(fā)表于 12-06 10:22 ?0次下載

    基于Arduino和OLED元胞自動(dòng)機(jī)

    電子發(fā)燒友網(wǎng)站提供《基于Arduino和OLED元胞自動(dòng)機(jī).zip》資料免費(fèi)下載
    發(fā)表于 06-20 11:02 ?0次下載
    基于Arduino和OLED元胞<b class='flag-5'>自動(dòng)機(jī)</b>

    GD32 MCU啟動(dòng)后如何運(yùn)行main函數(shù)

    GD32 MCU啟動(dòng)后如何運(yùn)行main函數(shù)入口?你是否也有這樣的疑慮。執(zhí)行到main函數(shù)之前
    的頭像 發(fā)表于 01-15 10:00 ?862次閱讀
    GD32 MCU啟動(dòng)后如何<b class='flag-5'>運(yùn)行</b>到<b class='flag-5'>main</b><b class='flag-5'>函數(shù)</b>