Informe del experimento del analizador léxico (código fuente C++, diagrama de estado, diagrama de flujo, método empaquetado .exe)

                   Diseño e Implementación de un Analizador Léxico            

【Objetivo】

Al diseñar y compilar un programa de análisis léxico específico, profundice la comprensión del principio del análisis léxico y domine el programa.

Un método de análisis léxico que descompone el programa de origen del idioma en varias palabras durante la exploración.

【Requisitos experimentales】

  1. En este experimento, el analizador léxico está diseñado como una subrutina independiente para completar la tarea de análisis léxico.
  2. Proporcione el diagrama de transición de estado de reconocimiento del idioma de origen para el análisis léxico (este experimento es el lenguaje C) o su subconjunto.
  3. Diseñe la tabla de categorías de palabras y use el grupo binario para generar los símbolos de palabras (consulte el contenido del experimento para conocer los requisitos específicos).
  4. El uso del lenguaje C++ (el lenguaje de programación para escribir el analizador léxico) para realizar el diagrama de transición de estado de reconocimiento anterior puede reconocer los símbolos de palabras del idioma de origen o su subconjunto.

【Contenido experimental】

  1. Palabras clave: main, return, if, else, int, char
  2. Operadores y delimitadores: (){}, ;= != > < >= <= == + * /
  3. Identificador <id> y parámetro entero <num>

【Proceso experimental y resultados】

1. Diseño de tabla de categorías de palabras

palabra

codificación interna

palabra

codificación interna

palabra

codificación interna

palabra

codificación interna

principal

0

<identificación>

1

<número>

2

devolver

3

si

4

demás

5

En t

6

carbonizarse

7

(

8

)

9

{

10

}

11

,

12

;

13

=

14

!=

15

>

dieciséis

<

17

>=

18

<=

19

==

20

+

21

*

22

/

23

2. Construya un diagrama de transición de estado para reconocer palabras en el idioma de origen (lenguaje C )

                                                                Figura 1 Diagrama de transición de estado

En tercer lugar, la implementación del analizador léxico

1. diseño de diagrama de flujo

                                                                Figura 2 Diagrama de flujo del programa

2. código fuente clave

#include<bits/stdc++.h>

using namespace std;
map<string, string> word;
std::map<string, string>::iterator it;

///初始化
void map_init() {
    word["main"] = "0";
    word["return"] = "3";
    word["if"] = "4";
    word["else"] = "5";
    word["int"] = "6";
    word["char"] = "7";
    word["("] = "8";
    word[")"] = "9";
    word["{"] = "10";
    word["}"] = "11";
    word[","] = "12";
    word[";"] = "13";
    word["="] = "14";
    word["!="] = "15";
    word[">"] = "16";
    word["<"] = "17";
    word[">="] = "18";
    word["<="] = "19";
    word["=="] = "20";
    word["+"] = "21";
    word["*"] = "22";
    word["/"] = "23";
}
struct node {
    string id;
    string s;
}aa[10000];
int main() {
    map_init();
    char ch;
    char a;
    int len = 0;
    string word1;//string变量识别单词
    string str;//string变量进行字符识别

    cout << "-----------------词法分析器-----------------" << endl;

    string dir;
    cout << "请输入源文件地址:(路径中请不要包含中文)" << endl;
    cin >> dir;
    ifstream infile(dir);//文件输入流,文件路径
    cout << "请输入目标文件地址:" << endl;
    cin >> dir;
    ofstream outfile(dir);//文件输出流

    ostringstream buf;
    while (buf && infile.get(ch)) buf.put(ch);//将文件中的字符读出来
    str = buf.str();//将得到的字符储存到string类型变量中
    int csize = str.length();
    for (int i = 0; i < csize; i++) {//对整个字符串进行遍历
        while (str[i] == ' ' || str[i] == '\n') i++;//若最开始为空格或换行符,则将指针的位置往后移
        if (isalpha(str[i])) {//对标识符和基本字进行识别,调用库函数isalpha()
            word1 = str[i++];
            while (isalpha(str[i]) || isdigit(str[i])) {
                word1 += str[i++];
            }
            it = word.find(word1);
            if (it != word.end()) {//判断是不是基本字,若为基本字则进行输出
                cout << "(" << word[word1] << "," << word1 << ")" << endl;
                aa[len].id = word[word1];
                aa[len++].s = word1;
            }
            else {//否则直接输出
                cout << "(1" << "," << word1 << ")" << endl;
                aa[len].id = "1";
                aa[len++].s = word1;
            }
            i--;
        }
        else if (isdigit(str[i])) {//判断是不是常数,调用库函数isdigit()
            word1 = str[i++];
            while (isdigit(str[i])) {
                word1 += str[i++];
            }
            if (isalpha(str[i])) {
                cout << "error1!" << endl;
                break;
            }
            else {
                cout << "(2" << "," << word1 << ")" << endl;
                aa[len].id = "2";
                aa[len++].s = word1;
            }
            i--;
        }
        else if (str[i] == '<') {//对<,<=分别进行判断
            word1 = str[i++];
            if (str[i] == '>') {
                word1 += str[i];
                cout << "(" << word[word1] << "," << word1 << ")" << endl;
                aa[len].id = word[word1];
                aa[len++].s = word1;
            }
            else if (str[i] == '=') {
                word1 += str[i];
                cout << "(" << word[word1] << "," << word1 << ")" << endl;
                aa[len].id = word[word1];
                aa[len++].s = word1;
            }
            else if (str[i] != ' ' || !isdigit(str[i]) || !isalpha(str[i])) {
                cout << "(" << word[word1] << "," << word1 << ")" << endl;
                aa[len].id = word[word1];
                aa[len++].s = word1;
            }
            else {
                cout << "error2!" << endl;
                break;
            }
            i--;
        }
        else if (str[i] == '>') {//对>,>=分别进行判断
            word1 = str[i++];
            if (str[i] == '=') {
                word1 += str[i];
                cout << "(" << word[word1] << "," << word1 << ")" << endl;
                aa[len].id = word[word1];
                aa[len++].s = word1;
            }
            else if (str[i] != ' ' || !isdigit(str[i]) || !isalpha(str[i])) {
                cout << "(" << word[word1] << "," << word1 << ")" << endl;
                aa[len].id = word[word1];
                aa[len++].s = word1;
            }
            else {
                cout << "error3!" << endl;
                break;
            }
            i--;
        }
        else if (str[i] == ':') {//对:=进行判断
            word1 = str[i++];
            if (str[i] == '=') {
                word1 += str[i];
                cout << "(" << word[word1] << "," << word1 << ")" << endl;
                aa[len].id = word[word1];
                aa[len++].s = word1;
            }
            else if (str[i] != ' ' || !isdigit(str[i]) || !isalpha(str[i])) {
                cout << "(" << word[word1] << "," << word1 << ")" << endl;
                aa[len].id = word[word1];
                aa[len++].s = word1;
            }
            else {
                cout << "error4!" << endl;
                break;
            }
            i--;
        }
        else {//对其他的基本字依次进行判断
            word1 = str[i];
            it = word.find(word1);
            if (it != word.end()) {
                cout << "(" << word[word1] << "," << word1 << ")" << endl;
                aa[len].id = word[word1];
                aa[len++].s = word1;
            }
            //else {
            //    cout << "error5!" << endl;
            //    break;
            //}
        }
    }
    //输出流,输出到对应的结果文件中
    if (outfile.is_open())
    {
        for (int i = 0; i < len; i++) {
            outfile << "(" << aa[i].id << "," << aa[i].s << ")" << '\n';
        }
        outfile.close();
    }
    infile.close();

    cout << "输入任意键关闭" << endl;
    string s;
    cin >> s;
    return 0;
}

3. Efecto de ejecución del analizador léxico

 

                                                        Figura 3 Gráfico de resultados de la operación

                                                        Figura 4 Diagrama del archivo fuente

                                                              Figura 4 Diagrama de archivo de objeto

4. Problemas y sus soluciones durante el experimento

Una vez que el programa está empaquetado en .exe, puede ejecutarse en su propia computadora, pero no puede ejecutarse en otras computadoras. Al buscar la información, se encuentra que la posible razón es que el host de destino no tiene dlls relacionados o problemas de sistema y procesador, y los dlls relacionados también deben empaquetarse al empaquetar;

Cinco , empaquetado del programa C++

VS no tiene la biblioteca universal #include<bits/stdc++.h>, por lo que debe configurarla usted mismo. . , Hay una manera de buscar casualmente en Internet.

(1)

(2)

 

 (3)

 (4)

(5) Ejecútelo, vaya al archivo Debug para encontrarlo, no se preocupe y envíelo a un buen amigo para que lo pruebe.

Supongo que te gusta

Origin blog.csdn.net/qq_51491918/article/details/127836620
Recomendado
Clasificación