【问题标题】:C++ tokenizationC++ 标记化
【发布时间】:2014-05-03 13:41:32
【问题描述】:

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

【问题讨论】:

  • 你为什么不使用 Lex + Yacc (Bison)?
  • 我使用了 JavaCC,但我现在正在手工制作一个

标签: c++ compiler-construction tokenize lexer


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    有多种解决方案。

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

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

    这很好用......当分隔符很容易时。

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

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

    在这些情况下......好吧,不要理会标记器的差异,让您的 AST 构建通过消除歧义,它会获得更多信息。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 通常在标记化中有多个分隔符,例如所有形式的空格(16 个不同的 unicode 代码点)都可以被视为分隔符。分隔符也可以是上下文的:在解析标识符(比如\w+)时,任何匹配\W 的字符都是分隔符:允许将2+3 解析为3 个标记。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 2010-10-30
      • 2016-10-30
      • 1970-01-01
      相关资源
      最近更新 更多