C ++标记化

时间:2014-05-03 13:41:32

标签: c++ compiler-construction tokenize lexer

我正在用C ++编写一个词法分析器,我正逐字逐句地读取文件,但是,在这种情况下你如何进行标记化?我不能使用strtok,因为我的字符不是字符串。不知怎的,我需要继续阅读,直到我到达一个分界线?

3 个答案:

答案 0 :(得分:2)

答案是。你需要继续阅读,直到你达到分界符。

答案 1 :(得分:0)

有多种解决方案。

最简单的方法就是:保留已经读过的字符的缓冲区(std::string),直到找到分隔符。此时,您从缓冲区中的累积字符构建一个令牌,清除缓冲区,并在缓冲区中推送分隔符(如果需要)。

另一种解决方案是提前阅读:即,使用std::getline(例如)选取整行,然后检查此行上的内容。通常,行尾是一个自然的标记分隔符。

这很有效......当分隔符很容易时。

不幸的是,某些语言(如C ++)具有笨拙的语法。例如,在C ++ >>中可以是:

  • 运营商>>(用于右移和流提取)
  • 两个嵌套模板的结尾(即可以重写为> >

在这些情况下......好吧,只是不要担心令牌化程序的差异,让你的AST建筑消除歧义,它获得了更多的信息。

答案 2 :(得分:0)

根据您提供的信息。 如果要从文件中读取分隔符,请使用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 

    }