中科大 编译原理 从零开始的编译原理(第四单元:语法分析(Part I) 算术表达式的语法分析器)


前引


刚刚才发现这个作业真的挺不错的
如果对于想要自己实现正则引擎的hxd们 应该先来看一下这个十分简单的作业 对基本的递归下降分析有个初步的认识 再去实现


个人认为这个任务有个地方老师给错了 就是第二个检查点 e = (3+4*5))
应该改成e = (3+4*5) 后面多个括号
我刚开始还以为里面让我们加个对多余括号的判断 在处理中 对于哪里出错的地方自然而然进行 \0的操作 从此处断开 结果自己尝试了一下 发现它任务的赋值 字符串是常量字符串 所以不能更改其中的字符 = = 所以我认为那里是写错了 把后面的括号删掉即可 任务很简单

我认为应该让我们从零开始写 这个四则运算的语法分析器 可惜并没有


第四单元:语法分析(Part I)


1、任务介绍


在这个题目中,要求你完成一个针对算术表达式的语法分析器。该算术表达式的上下文无关文法是:
E -> E + T
| E - T
| T
T -> T * F
| T / F
| F
F -> num
| (E)
请下载我们提供的C代码框架,并把其中缺少的部分补充完整。
代码下载地址:


2、实现思路


其实这部分应该让我们从零开始写的 自己写个语法分析 但是并没有 我们先从文法开始看
在这里插入图片描述

这里的话 就是括号的优先级最高 其次是乘除号 最后是加号
我们通过递归下降 因为这里的数字限制于0-9 所以的话 每个非( ) + - * / 我们就可以把它认为是终结符 对于F 如果刚开始没有( 那么就是终结符 直接处理即可

因为限制了0-9 所以大大的降低了最后的parse_F处理难度 我们先去下载文件 改动的地方很简单 主要是让你理解 我们的最后递归下降分析是怎么实现的


3、代码实现


改动的地方如下 一个加上c == '-' 一个加上 c == '/'即可

void parse_E()
{
  parse_T();
  char c = str[i];
  while (c=='+'|| c=='-'){
    i++;
    parse_T();
    c = str[i];
  }

  return;
}

void parse_T()
{
  parse_F();
  char c = str[i];
  while (c=='*' || c=='/'){
    i++;
    parse_F();
    c = str[i];
  }
  return;
}

4、示例输入 + 实现效果


这里的示例其实可以自己加很多的 就是一个递归下降分析 但是不能接受输入错误的表达式 我们这里没有对错误进行处理

就不放了实现效果了 就是一个return 0; = =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Love 6

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

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

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

打赏作者

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

抵扣说明:

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

余额充值