詞法分析器實驗報告


一、        實驗目的

編制一個詞法分析器,通過該詞法分析程序的設計實例,進一步了解詞法分析程序構造的一些細節。

 

 

二、        實驗內容和要求

實驗內容:

對字符串表示的源程序,從左到右進行掃描和分解。根據詞法規則,識別出一個一個具有獨立意義的單詞符號,以供語法分析之用,若發現詞法錯誤,則返回出錯信息。

 

實驗要求:

輸入:源程序字符串

輸出:二元組(種別,單詞本身)

待分析語言的詞法規則

 

三、        實驗方法、步驟及結果測試

 1.      源程序名:cffx.cpp

可執行程序名 cffx.exe

2.      原理分析及流程圖

存儲結構:數組,string類

 

主要算法:

void way()
{
    string s;
    cout << "輸入字符串" << endl;
    getline(cin, s);//getline函數可以使輸入到string時不會因空格而使后面內容無法錄入到s中,僅接受回車結束輸入
    for (int i = 1; i <= 6; i++)
    {
        auto found = s.find(key[i]);//find函數找尋s字符串中與key[i]相符合的字符串,若找到則返回該字符串在s中首字母的下標
        if (found != string::npos)//npos為string類中的變量,即-1;若found不等於npos則表示找到s中與key[i]相符合的關鍵字
        {
            int lon = key[i].length();//得出字符串長度
            for (int j = 0; j < lon; j++, found++)
                cout << s[found];
            cout << "種別碼為" << i << endl;
        }
    }
}

流程圖:

3.      主要程序段及其解釋:

#include<iostream>
#include<string>
using namespace std;
string key[] = { "", "begin", "if", "then", "while", "do", "end" };
void way();//實現詞法分析器功能
int main()
{
    char a;
    while (1)
    {
        way();
        cout << "是否繼續輸入" << endl;
        cin >> a;
        getchar();
        if (a == 'n' || a == 'N')
            break;
    }
    system("pause");
    return 0;
}
void way()
{
    string s;
    cout << "輸入字符串" << endl;
    getline(cin, s);//getline函數可以使輸入到string時不會因空格而使后面內容無法錄入到s中,僅接受回車結束輸入
    for (int i = 1; i <= 6; i++)
    {
        auto found = s.find(key[i]);//find函數找尋s字符串中與key[i]相符合的字符串,若找到則返回該字符串在s中首字母的下標
        if (found != string::npos)//npos為string類中的變量,即-1;若found不等於npos則表示找到s中與key[i]相符合的關鍵字
        {
            int lon = key[i].length();//得出字符串長度
            for (int j = 0; j < lon; j++, found++)
                cout << s[found];
            cout << "種別碼為" << i << endl;
        }
    }
}

4.      運行結果及分析

 

四、        實驗總結

 

實驗難點在於如何在輸入的字符串中找到關鍵字,本程序用了string類的find方法,先判斷是否存在關鍵字,若存在則返回關鍵字在字符串出現的位置的首字符下標,再根據length得出關鍵字長度,利用for循環輸出關鍵字,並根據關鍵字所在的關鍵字數組的下標,輸出種別碼。本次實驗使我進一步了解詞法分析程序構造的一些細節。

 


免責聲明!

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



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