返回介绍

扫瞄标识符

发布于 2025-02-24 22:44:38 字数 878 浏览 0 评论 0 收藏 0

在 3.2 节中我们实现了函数 scan() ,从主程序获取一行输入并在每次调用返回一个输入符号。如果我们想引进关键字,命名常量等等,我们需要扩展 scan() 。像浮点数一样,我们提取字符数字串以供深入分析:


  #define ALNUM  "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
          "abcdefghijklmnopqrstuvwxyz" \
          "_" "0123456789"

  static enum tokens scan (const char * buf) {
    static const char * bp;
    …
    if (isdigit(* bp) || * bp == '.')
      …
    else if (isalpha( *bp) || *bp == '_') {
      char buf[BUFSIZ];
      int len = strspn(bp, ALNUM);

      if (len >= BUFSIZ)
        error("name too long: %-.10s…", bp);

      strncpy(buf, bp, len), buf[len] = '\0', bp += len;
      token = screen(buf);
    }
    ...

一旦我们有了一个标识符,我们让新函数 screen() 来决定它的 token 值应当是什么。如果有必要, screen() 将会存放一个解析器可以识别的符号描述到全局变量 symbol 中。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文