c++ - 这是词法分析器的代码 谁能详细解释这段代码?

标签 c++ compiler-construction

这是 C++ 中的词法分析器代码,任何人都可以向我解释该代码并告诉我如何从文件中读取字符串

using namespace std;

function

int isKeyword(char buffer[]){
char keywords[32][10] = {"auto","break","case","char","const","continue","default",
                        "do","double","else","enum","extern","float","for","goto",
                        "if","int","long","register","return","short","signed",
                        "sizeof","static","struct","switch","typedef","union",
                        "unsigned","void","volatile","while"};
int i, flag = 0;

这里发生了什么?为什么我们使用 strcmp 及其用途

for(i = 0; i < 32; ++i){
if(strcmp(keywords[i], buffer) == 0){
        flag = 1;
        break;
    }
}
 return flag;
}

main

int main()
{
char ch, buffer[15];
ifstream fin("program.txt");
int j=0;

if(!fin.is_open()){
    cout<<"error while opening the file\n";
    exit(0);
}
    while(!fin.eof()){
    ch = fin.get();

这里发生了什么?

    if(isalnum(ch))
    {
      buffer[j++] = ch;
    }

    else if((ch == ' ' || ch == '\n') && (j != 0)){
            buffer[j] = '\0';
            j = 0;                  
            if(isKeyword(buffer) == 1)
                cout<<buffer<<" is keyword\n";
            else
                cout<<buffer<<" is identifier\n";
    }       
}   
fin.close();    
return 0;
}

最佳答案

总体思路是用一个数据结构keywords[n][m]保存所有的关键词,然后一个词一个词地读取一个文件,检查这个词是否在keywords[ n][m] 是否为数组,即是否为关键字。 在 main 函数中,打开一个文件,逐字读取直到结束,并将该字传递给函数 iskeyword() 以判断该字是否为关键字。在 iskeyword() 函数中,我们在 for 循环中遍历二维数组 keywords[n][m] 并使用 strcmp 函数检查单词是否作为输入参数传递的字符串是否与二维数组的元素相同。如果单词在二维数组中,那么它是一个关键字,函数返回 1 并且 is keyword 被打印在屏幕上。否则返回 '0' 并将 'is identifier' 输出到屏幕。 more about strcmp here 希望这可以帮助!

关于c++ - 这是词法分析器的代码 谁能详细解释这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58467213/

相关文章:

c++ - 在另一个类中删除具有 protected 析构函数的对象

c++ - 从另一个模板对象调用模板方法时出现奇怪的编译行为

c++ - 通过避免函数来提高程序速度? (C++)

c - 是否有任何文档可用于 glibc 6 的动态链接器函数?

c++ - 具有TDM-GCC 4.9.2的DevC++ IDE中的额外资格错误

c++ - 为什么不能对具有析构函数的类进行 memcpy

c++ - 在头文件中包含模板实现cpp文件和链接困惑

compiler-construction - Fortran 控制字符(回车控制)是否仍在编译器中实现?

java - 需要服务器上的编译器

ios - 编译器如何知道按钮已被按下?