读龙书学编译原理 语法分析(6)...

这两天都没更, 主要是马上要连着要考三门(16, 18, 20), 都没时间学编译器了, 等过了这段时间应该能有很多时间来搞这个, 之后我准备先把之前写的那个词法分析器生成器改造一下, 弄个最简版的正则引擎出来玩玩, 不过这些都是后话了, 今天似乎也没什么时间, 也就把这单元的作业写了一下... 代码比较简单就不多做解释了...

  1 #include <ctype.h>
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4
  5 void parse_F();
  6 void parse_T();
  7 void parse_E();
  8 void error (char *want, char got);
  9
 10 int i;
 11 char *str = 0;
 12
 13 void error (char *want, char got)
 14 {
 15     fprintf (stderr, "Compling this expression:\n%s\n", str);
 16     int j = i;
 17     while (j--)
 18         fprintf (stderr, " ");
 19     fprintf (stderr, "^\n");
 20     fprintf (stderr, "Syntax error at position: %d\n"
 21             "\texpecting: %s\n"
 22             "\tbut got  : %c\n",
 23             i, want, got);
 24     exit (0);
 25     return;
 26 }
 27
 28 void parse_F()
 29 {
 30     char c = str[i];
 31     if (isdigit(c)){
 32         i++;
 33         return;
 34     }
 35     if (c==‘(‘){
 36         i++;
 37         parse_E();
 38         c = str[i];
 39         if (c==‘)‘){
 40             i++;
 41             return;
 42         }
 43         error ("\‘)\‘", c);
 44         return;
 45     }
 46     error ("\‘0-9\‘ or \‘(\‘", c);
 47     return;
 48 }
 49
 50
 51 void parse_T()
 52 {
 53     parse_F();
 54     char c = str[i];
 55     while (c==‘*‘ || c == ‘/‘){
 56         i++;
 57         parse_F();
 58         c = str[i];
 59     }
 60     return;
 61 }
 62
 63 void parse_E()
 64 {
 65     parse_T();
 66     char c = str[i];
 67     while (c ==‘+‘ || c == ‘-‘){
 68         i++;
 69         parse_T();
 70         c = str[i];
 71     }
 72     return;
 73 }
 74
 75 void parse (char *e)
 76 {
 77     str = e;
 78     i = 0;
 79     parse_E();
 80     if (str[i]==‘\0‘)
 81         return;
 82     error ("\‘+\‘ or ‘\\0\‘", str[i]);
 83     return;
 84 }
 85 ///////////////////////////////////////////////
 86 // Your job:
 87 // Add some code into the function parse_E() and
 88 // parse_T to parse "-" and "/" correctly.
 89 // When you finish your task, NO error message
 90 // should be generated.
 91 // Enjoy! :-P
 92 int main (int argc, char **argv)
 93 {
 94     // There are the following rules on an expression:
 95     //   1. Every expression is represented as a string;
 96     //   2. integers are non-negative;
 97     //   3. integers are between 0-9.
 98     char *e;
 99
100     e = "(2)";
101     parse(e);
102
103     e = "(3+4*5))";
104     parse(e);
105
106     e = "(8-2)*3";
107     parse(e);
108
109     e = "(8-2)/3";
110     parse(e);
111
112     return 0;
113 }
时间: 2024-10-08 19:35:11

读龙书学编译原理 语法分析(6)...的相关文章

读龙书学编译原理 语法分析(12)...

那么最后我就来看看这个所谓的lr(0)分析表生成算法 : 这个算法乍一看好像又和前面脱节了, 但是如果仔细看之前的讲解, 比如下图, 仔细比较, 感受一下 ... 你会发现 : 每次产生的D其实就相当于是一个新的状态, 那么再看一下closure 和 goto的具体实现 : 不难发现closure其实就是把所有原推导式左侧点的右侧的非终结符(也就是即将探索的第一个非终结符)的推导式全部加入这个集合, 那么为什么要这样做呢 ? 因为这个算法是并行的, 比如上图, 在执行推导式0的时候, 他需要先完

读龙书学编译原理 语法分析(1)...

首先我们来分析一下语法分析器的任务 : 将由词法分析器返回的Tokens(记号流)经过检查和处理生成根据规定的语法规则来生成抽象语法树... 最终大概是这样 (两个输入 一个输出): 然后是语法树, 大概是这样 : 那么接下来看看在这一阶段所需要学习的内容 : 大概就是这样...

读龙书学编译原理 语法分析(15)...

到这里词法分析模块就接近尾声了, 下面对词法分析模块进行总结 : 递归下降本质上也算是自顶向下的分析算法, 适合手工编码, 它相对来说更加灵活, 能够对于特定的DSL进行更加灵活的处理优化, 但是相对来说比较慢.而自动生成器则恰好相反, 接下来是一个LR(1)语法生成器的实例 -- YACC. 首先这是yacc所需的源文件的结构, 通过输入这个文件yacc能为我们生成实际的语法分析器的代码... 由图中可以看出该文件分为三个部分, 下面是实例代码 : 1 %{ 2 #include <stdio

读龙书学编译原理 语法翻译(3)...

接着上节讲, 我们来看如何在分析中插入合适的代码来生成语法树... 对于抽象语法树的总结 : 下面是作业 : [抽象语法树] 在这个题目中,你将完整的实现抽象语法树(包括数据结构的定义.语法树的生成等).首先,请下载我们提供的代码包: http://staff.ustc.edu.cn/~bjhua/mooc/ast.zip 代码的运行方式是: 首先生成语法分析器: $ bison exp.y 然后生成编译器: $ gcc main.c exp.tab.c ast.c 最后使用编译器编译某个源文件

读龙书学编译原理 手撸编译器(2)...

经过一天的实践, 勉强写完了语法分析部分和词法分析的抽象语法树的生成部分... 但是也发现也昨天规定的词法和文法中出现的一些问题, 同时我根据情况进行了一些改动... prog -> func funcs | func -> type id () block block -> { stmts } stmts -> stmt stmts | stmt -> type id; | type id = judge; | id = judge; | if(judge) block |

读龙书学编译原理 语法翻译(1)...

完成了语法分析, 那么这一阶段最后要讨论的就是如何生成抽象语法树了...这一阶段称之为语法翻译 : 那么我们来看看翻译的基本思想 : 其实现如下 : 下面是具体实例 :

读龙书学编译原理 手撸词法生成器(3)...

今天撸了一个晚上终于完成了, 感觉还是要说一下体会吧... 其实之前课程本身已经提供了相关的算法伪代码, 那么在思路上应该没有问题, 那么最后我却用了一个晚上才完成最后的hopcroft 算法呢... 其实难点在于数据结构的运用, 这边图论算法熟悉的话应该会感觉轻松一些...(不幸的是我还没有系统的学过算法...) 就具体代码实现本身来讲, 第一个难点在于如何对已存在的状态进行切分, 比较说起来就是split而已, 但实际操作起来切得却是一串dfa的状态, 我刚开始准备只用一个State(用于第

读龙书学编译原理 手撸词法生成器(2)...

今天AI考的还算顺利, 没有不会做的, 目前也没发现错的, 在这里顺便也谈谈AI吧, 我之所以不选AI, 总感觉理论性太强, 学起来不来劲, 经历了大二这一个学期的理论学习, 这AI简直是神课啊, 真是怕了, 大三到英国肯定不选AI... 其实就算在今天下午在考试我也是一直惦记着我的词法生成器... 6点考完, 休息了一波8点左右就开始继续写我的词法生成器的第二部分(从NFA到DFA)了, 过程的还算是顺利, 2个小时左右也就写完了, 之后刷知乎刷到了现在, 真是浪费时间啊... 明天再写一下最

读龙书学编译原理 手撸编译器(3)...

写到12点20勉强算是实现了, 缺陷还很多就不多说了, 具体自己上github去看, 上面我写的很清楚... 发现有任何bug随时联系我... https://github.com/zhang77595103/Simple-C