├── 55190521-季圣鹏-代码.cpp ├── 55190521-季圣鹏-实验报告一.docx ├── 55190521-季圣鹏-实验报告三.docx ├── 55190521-季圣鹏-实验报告二.docx ├── 55190521-季圣鹏-实验报告四.docx ├── 55190521-季圣鹏-视频.mp4 ├── Lexical.cpp ├── README.md ├── 测试程序一.txt ├── 测试程序二.txt ├── 程序一结果.txt └── 程序二结果.txt /55190521-季圣鹏-代码.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jishengpeng/Design-compiler/6f46f491019a737ebe5397fa17ecefbf272178e5/55190521-季圣鹏-代码.cpp -------------------------------------------------------------------------------- /55190521-季圣鹏-实验报告一.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jishengpeng/Design-compiler/6f46f491019a737ebe5397fa17ecefbf272178e5/55190521-季圣鹏-实验报告一.docx -------------------------------------------------------------------------------- /55190521-季圣鹏-实验报告三.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jishengpeng/Design-compiler/6f46f491019a737ebe5397fa17ecefbf272178e5/55190521-季圣鹏-实验报告三.docx -------------------------------------------------------------------------------- /55190521-季圣鹏-实验报告二.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jishengpeng/Design-compiler/6f46f491019a737ebe5397fa17ecefbf272178e5/55190521-季圣鹏-实验报告二.docx -------------------------------------------------------------------------------- /55190521-季圣鹏-实验报告四.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jishengpeng/Design-compiler/6f46f491019a737ebe5397fa17ecefbf272178e5/55190521-季圣鹏-实验报告四.docx -------------------------------------------------------------------------------- /55190521-季圣鹏-视频.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jishengpeng/Design-compiler/6f46f491019a737ebe5397fa17ecefbf272178e5/55190521-季圣鹏-视频.mp4 -------------------------------------------------------------------------------- /Lexical.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jishengpeng/Design-compiler/6f46f491019a737ebe5397fa17ecefbf272178e5/Lexical.cpp -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 项目介绍 2 | #### 这是吉林大学编译原理课程设计,设计一个能够对SNL语言进行编译的词法分析器,语法分析器。 3 | #### Lexical.cpp是词法分析器的源代码。 4 | #### 编译原理设计与实践原理.pdf(阅读的书籍)。 5 | ## 设计原理 6 | #### 基于VS2019 C++实现, 7 | #### 词法分析器就是将输入编译器中的源代码转换成TOKEN序列。这个是利用动态数组进行存储,利用双指针和字符串匹配的一些知识。 8 | #### 语法分析器是编译器的核心,我主要采用递归下降法进行分析,目的是将TOKEN序列转换成动态的语法分析树。这个依赖自顶向下的文法,Pridect集,递归下降法,数据结构(树),递归等技术。 9 | ## 项目后续(2,3,4不是近期打算) 10 | #### 1.会在6.10之后更新全部源代码。并且对于语法分析器的实现进行解释说明。 11 | #### 2.优化语言的表达式和错误处理,因为时间有限,没有测试到一个语言真正所有的情形,后续会根据参考书中有诸多错误和测试进行完善。 12 | #### 3.利用QT对此进行可视化。(一千行的控制台也是控制台,过于丑陋)。 13 | #### 4.完成一个编译器的后续部分,包括语义分析器,中间代码生成,中间代码优化,目标代码生成。 14 | ## 项目意义 15 | #### 大三的一个课设,手撕一个词法分析器对于大部分同学来说没有难度。但是语法分析器确实需要对编译知识有着一些理解。而且六月初这个时间基本都在考/保/工,为了一门必修课三分之差的投入和产出比确实太小。希望能够对看到此仓库的学弟学妹们在代码层面能有较大的借鉴意义。 16 | 17 | -------------------------------------------------------------------------------- /测试程序一.txt: -------------------------------------------------------------------------------- 1 | program p 2 | type t = integer; 3 | var t v1 ; 4 | char v2; 5 | begin 6 | read(v1); 7 | v1:=v1*10; 8 | v1 = "d"; 9 | v2:= 'a'; 10 | write(v1) 11 | end. 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /测试程序二.txt: -------------------------------------------------------------------------------- 1 | program p 2 | type t1 = integer; 3 | var integer v1,v2; 4 | procedure 5 | q(integer i); 6 | var integer a; 7 | begin 8 | a:=i; 9 | write(a) 10 | end 11 | begin 12 | read(v1); 13 | if v1<10 14 | then v1:=v1+10 15 | else v1:=v1-10 16 | fi; 17 | q(v1) 18 | end. -------------------------------------------------------------------------------- /程序一结果.txt: -------------------------------------------------------------------------------- 1 | 请输入SNL程序片段: 2 | program p 3 | type t = integer; 4 | var t v1 ; 5 | char v2; 6 | begin 7 | read(v1); 8 | v1:=v1*10; 9 | v1 = "d"; 10 | v2:= 'a'; 11 | write(v1) 12 | end. 13 | 输入程序段经过词法分析器之后的Token序列为: 14 | reserved word,PROGRAM 15 | CHAR,p 16 | reserved word,TYPE 17 | CHAR,t 18 | EQ,= 19 | reserved word,INTEGER 20 | SEMI,; 21 | reserved word,VAR 22 | CHAR,t 23 | ID,v1 24 | SEMI,; 25 | reserved word,CHAR 26 | ID,v2 27 | SEMI,; 28 | reserved word,BEGIN 29 | reserved word,READ 30 | LPAREN,( 31 | ID,v1 32 | RPAREN,) 33 | SEMI,; 34 | ID,v1 35 | ASSIGN,:= 36 | ID,v1 37 | TIMES,* 38 | NUM,10 39 | SEMI,; 40 | ID,v1 41 | EQ,= 42 | SY," 43 | CHAR,d 44 | SY," 45 | SEMI,; 46 | ID,v2 47 | ASSIGN,:= 48 | COMMA,' 49 | CHAR,a 50 | COMMA,' 51 | SEMI,; 52 | reserved word,WRITE 53 | LPAREN,( 54 | ID,v1 55 | RPAREN,) 56 | reserved word,END 57 | DOT,. 58 | EOF 59 | 程序经过语法分析器之后的语法分析树为: 60 | Prok 61 | PheadK p 62 | TYPE 63 | Deck INTEGER t 64 | VAR 65 | DecK t v1 66 | DecK CHAR v2 67 | StmLK 68 | StmtK READ 69 | ExpK v1 IdK 70 | StmtK AssignK 71 | ExpK v1 IdK 72 | ExpK v1 IdK 73 | ExpK OP * 74 | ExpK const 10 75 | StmtK AssignK 76 | ExpK v1 IdK 77 | ExpK d IdK 78 | StmtK AssignK 79 | ExpK v2 IdK 80 | ExpK a IdK 81 | StmtK WRITE 82 | ExpK v1 IdK 83 | 语法分析树生成成功 84 | D:\编译器\vs代码区\compiler\Debug\compiler.exe (进程 16132)已退出,代码为 0。 85 | 按任意键关闭此窗口. . . 86 | -------------------------------------------------------------------------------- /程序二结果.txt: -------------------------------------------------------------------------------- 1 | 请输入SNL程序片段: 2 | program p 3 | type t1 = integer; 4 | var integer v1,v2; 5 | procedure 6 | q(integer i); 7 | var integer a; 8 | begin 9 | a:=i; 10 | write(a) 11 | end 12 | begin 13 | read(v1); 14 | if v1<10 15 | then v1:=v1+10 16 | else v1:=v1-10 17 | fi; 18 | q(v1) 19 | end. 20 | 输入程序段经过词法分析器之后的Token序列为: 21 | reserved word,PROGRAM 22 | CHAR,p 23 | reserved word,TYPE 24 | ID,t1 25 | EQ,= 26 | reserved word,INTEGER 27 | SEMI,; 28 | reserved word,VAR 29 | reserved word,INTEGER 30 | ID,v1 31 | JSP1,, 32 | ID,v2 33 | SEMI,; 34 | reserved word,PROCEDURE 35 | CHAR,q 36 | LPAREN,( 37 | reserved word,INTEGER 38 | CHAR,i 39 | RPAREN,) 40 | SEMI,; 41 | reserved word,VAR 42 | reserved word,INTEGER 43 | CHAR,a 44 | SEMI,; 45 | reserved word,BEGIN 46 | CHAR,a 47 | ASSIGN,:= 48 | CHAR,i 49 | SEMI,; 50 | reserved word,WRITE 51 | LPAREN,( 52 | CHAR,a 53 | RPAREN,) 54 | reserved word,END 55 | reserved word,BEGIN 56 | reserved word,READ 57 | LPAREN,( 58 | ID,v1 59 | RPAREN,) 60 | SEMI,; 61 | reserved word,IF 62 | ID,v1 63 | LT,< 64 | NUM,10 65 | reserved word,THEN 66 | ID,v1 67 | ASSIGN,:= 68 | ID,v1 69 | PLUS,+ 70 | NUM,10 71 | reserved word,ELSE 72 | ID,v1 73 | ASSIGN,:= 74 | ID,v1 75 | MINUS,- 76 | NUM,10 77 | reserved word,FI 78 | SEMI,; 79 | CHAR,q 80 | LPAREN,( 81 | ID,v1 82 | RPAREN,) 83 | reserved word,END 84 | DOT,. 85 | EOF 86 | 程序经过语法分析器之后的语法分析树为: 87 | Prok 88 | PheadK p 89 | TYPE 90 | Deck INTEGER t1 91 | VAR 92 | DecK INTEGER v1 v2 93 | PROCEDURE 94 | HDeck q 95 | DecK value param INTEGER i 96 | VAR 97 | DecK INTEGER a 98 | StmLK 99 | StmtK AssignK 100 | ExpK a IdK 101 | ExpK i IdK 102 | StmtK WRITE 103 | ExpK a IdK 104 | StmLK 105 | StmtK READ 106 | ExpK v1 IdK 107 | StmtK IF 108 | ExpK v1 IdK 109 | ExpK OP < 110 | ExpK const 10 111 | StmtK THEN 112 | ExpK v1 IdK 113 | ExpK v1 IdK 114 | ExpK OP + 115 | ExpK const 10 116 | StmtK ELSE 117 | ExpK v1 IdK 118 | ExpK v1 IdK 119 | ExpK OP - 120 | ExpK const 10 121 | StmtK CALL 122 | ExpK q IdK 123 | ExpK v1 IdK 124 | 语法分析树生成成功 125 | D:\编译器\vs代码区\compiler\Debug\compiler.exe (进程 8908)已退出,代码为 0。 126 | 按任意键关闭此窗口. . . 127 | --------------------------------------------------------------------------------