语法分析(6)...
2016-05-14 19:09
295 查看
这两天都没更, 主要是马上要连着要考三门(16, 18, 20), 都没时间学编译器了, 等过了这段时间应该能有很多时间来搞这个, 之后我准备先把之前写的那个词法分析器生成器改造一下, 弄个最简版的正则引擎出来玩玩, 不过这些都是后话了, 今天似乎也没什么时间, 也就把这单元的作业写了一下... 代码比较简单就不多做解释了...
#include <ctype.h> #include <stdio.h> #include <stdlib.h> void parse_F(); void parse_T(); void parse_E(); void error (char *want, char got); int i; char *str = 0; void error (char *want, char got) { fprintf (stderr, "Compling this expression:\n%s\n", str); int j = i; while (j--) fprintf (stderr, " "); fprintf (stderr, "^\n"); fprintf (stderr, "Syntax error at position: %d\n" "\texpecting: %s\n" "\tbut got : %c\n", i, want, got); exit (0); return; } void parse_F() { char c = str[i]; if (isdigit(c)){ i++; return; } if (c=='('){ i++; parse_E(); c = str[i]; if (c==')'){ i++; return; } error ("\')\'", c); return; } error ("\'0-9\' or \'(\'", c); return; } void parse_T() { parse_F(); char c = str[i]; while (c=='*' || c == '/'){ i++; parse_F(); c = str[i]; } return; } void parse_E() { parse_T(); char c = str[i]; while (c =='+' || c == '-'){ i++; parse_T(); c = str[i]; } return; } void parse (char *e) { str = e; i = 0; parse_E(); if (str[i]=='\0') return; error ("\'+\' or '\\0\'", str[i]); return; } /////////////////////////////////////////////// // Your job: // Add some code into the function parse_E() and // parse_T to parse "-" and "/" correctly. // When you finish your task, NO error message // should be generated. // Enjoy! :-P int main (int argc, char **argv) { // There are the following rules on an expression: // 1. Every expression is represented as a string; // 2. integers are non-negative; // 3. integers are between 0-9. char *e; e = "(2)"; parse(e); e = "(3+4*5))"; parse(e); e = "(8-2)*3"; parse(e); e = "(8-2)/3"; parse(e); return 0; }
相关文章推荐
- L3-2 堆栈 团体程序设计天梯赛-练习集
- ElasticSearch(四)--分布式文档存储
- 基于SSH框架开发的《高校大学生选课系统》的质量属性的实现
- 如何利用hibernate3解决数据库丢失更新问题?
- JVM监控工具介绍
- PHP笔记②所有输出语句
- ORA-03113
- 仿美团外卖,饿了吗 两个ListView联动,左边点击切换右边,右边滑动切换左边
- RMQ (范 围 最 值 问 题)
- 第17章 KDE的Qt
- java反射机制
- 关于三年工作的一点点感悟
- 5-38 数列求和-加强版 (20分)
- linux驱动模板
- web.xml详解
- HDU 1060 Leftmost Digit(求 n ^ n 的最高位的值)
- 安卓6.0适配问题 (主华为 p7 p8)
- Python全栈开发之5、几种常见的排序算法以及collections模块提供的数据结构
- 常见的机器学习&数据挖掘知识点
- BZOJ 1013 [JSOI2008]球形空间产生器sphere