编译器构造- c++标记化

compiler construction - C++ tokenization

本文关键字:c++ 编译器      更新时间:2023-10-16

我正在用c++编写一个词法分析器,并且我正在从文件中逐个字符地读取,但是,在这种情况下如何进行标记化?我不能使用strtok,因为我有字符而不是字符串。不知怎么的,我要一直读到定界器?

答案是。您需要继续阅读,直到遇到分隔符。

有多种解决方案

最简单的做法就是:保留已经读取的字符的缓冲区(std::string),直到到达分隔符。此时,从缓冲区中累积的字符构建一个标记,清除缓冲区,并将分隔符(如果需要)推入缓冲区。

另一个解决方案是提前读取:即,使用std::getline(例如)拾取整行,然后检查该行上的内容。一般来说,行尾是一个自然的标记分隔符。

这个工作得很好…当分隔符容易使用时。

不幸的是,有些语言,如c++,有令人尴尬的语法。例如,在c++中,>>可以是:

  • 操作符>>(右移和流提取)
  • 两个嵌套模板的结尾(即可以重写为> >)

在那些情况下…好吧,不要为标记器中的差异而烦恼,让您的AST构建通过消歧,它有更多的信息。

根据您提供的信息。如果你想从一个文件中读取一个分隔符,使用getline(char *,int,char)函数。

getline()用于读取最多n个字符或最多一个分隔符。

的例子:

 #include<fstream.h>
using namespace std;
    main()
    {
        fstream f;
        f.open("test.cpp",ios::in);
        char *c;
        f.getline(c,2,' ');
        cout<<c; // upto 1 char or till a space 
    }