文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
3.2 扫描器
在主循环中,一旦一个输入行被读入到 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论