返回介绍

3.2 扫描器

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

在主循环中,一旦一个输入行被读入到 buf[] 中,它将被传进 scan() , 此函数对于每一个调用把下一个输入符号放入变量 token 。在最后一行, token 的值为 0:

#include <ctype.h>
#include <errno.h>
#include <stdlib.h>
#include “parse.h”

static double number;      /* if NUMBER: numerical value */
static enum tokens scan (const char * buf)                 
{  
  static const char * bp;

     if (buf){
        bp = buf;         /* new input line */
     }
     while (isspace(* bp & 0xff)){
        ++ bp;
     }
     if (isdigit(* bp & 0xff) || * bp == '.')
     {
    errno = 0;
        token = NUMBER, number = strtod(bp, (char **) & bp);
        if (errno == ERANGE){
           error("bad value: %s", strerror(errno));
        }
     }
     else{
        token = * bp ? * bp ++ : 0;
     }
     return token;
}

我们调用 scan() ,可传递输入行缓冲的地址,或传进一个空指针得以继续工作在当前的行。空格被忽略,并且遇到第一个为数字或小数点,我们就是用一个 ANSI-C 的函数 strtod() 开始提取出浮点数字。若为其他的任何字符将被返回,并且我们不会预先在输入缓冲传递一个空字节。

scan() 的结果被存储在全局变量 token - 这样简化了识别程序(识别器)。如果我们侦测出一个数字,我们将返回唯一的值 NUMBER 并使得在全局变量 number 中实际的值有效。

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

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

发布评论

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