dcl源码解析

dcl代码解析

K&R的第五章最后一个示例程序是一个语法解析器,功能很强大,能将C语言的声明转换文文字形式,例如:

// 输入
int *a
// 输出
a pointer to int

该程序的源码竟然还不到100行。

需要强调的是,dcl和direct-dcl的定义:

dcl: direct-dcl前加一个可选的*
direct-dcl: name
						(dcl)
						direct-dcl()
						direct-dcl[optional size]

一定要记住这个,才能更好的理解dcl和dir-dcl的源码。

void dcl(void)
{
    int ns;
    for (ns = 0; gettoken() == '*';) /* count *'s */
        ns++;
    dirdcl();
    while (ns-- > 0)
        strcat(out, " pointer to");
}

dcl解析*,以及后面跟的dirdcl,解析完成后每个对应一个指针以此打印。

dir-dcl稍微复杂一些。

/* dirdcl:  parse a direct declarator */
void dirdcl(void)
{
    int type;
    if (tokentype == '(')
    {
        dcl();
        /* ( dcl ) */
        if (tokentype != ')')
            printf("error: missing )\\n");
    }
    else if (tokentype == NAME) /* variable name */
        strcpy(name, token);
    else
        printf("error: expected name or (dcl)\\n");
    while ((type = gettoken()) == PARENS || type == BRACKETS)
        if (type == PARENS)
            strcat(out, " function returning");
        else
        {
            strcat(out, " array");
            strcat(out, token);
            strcat(out, " of");
        }
}

因为第一次dirdcl的调用发生在dcl之后,而dcl方法调用了gettoken()解析,所以此时已经有token和token_type的信息了,因此先处理 (dcl)name 的情形。再去处理 direct-dcl() direct-dcl[optional size] 的情况。

最后就是gettoken()的实现:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光机121906

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值