前引
刚刚才发现这个作业真的挺不错的
如果对于想要自己实现正则引擎的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;
= =