├── README.md └── source ├── lexAnalysis ├── analyse.c └── text.c └── lexSynAnalysis ├── LexAnalysis.cpp ├── LexAnalysis.h ├── SynAnalysis.cpp ├── SynAnalysis.h ├── main.cpp ├── test.txt └── wenfa.txt /README.md: -------------------------------------------------------------------------------- 1 | # 编译原理 - C语言编译器(包括词法/语法分析器等) 2 | 3 | 4 | 5 | ## 项目结构如下 6 | 7 | 8 | ``` 9 | -source 10 | 11 | --lexAnalysis 词法分析器(原创) 12 | ---analyse.c 词法分析器 13 | ---text.c 测试用例(被分析的C代码) 14 | 15 | --lexSynAnalysis 语法分析器(转存) 16 | ---LexAnalysis.h 词法分析头文件 17 | ---SynAnalysis.h 语法分析头文件 18 | ---LexAnalysis.cpp 词法分析Cpp文件 19 | ---SynAnalysis.cpp 语法分析Cpp代码 20 | ---main.cpp 主文件 21 | ---wenfa.txt 文法 22 | ---test.txt 测试用例(被分析的C代码) 23 | ``` 24 | 25 | 26 | 27 | ## 词法分析器 28 | 29 | [注:Sourse中lexAnalysis文件夹中为原创, 欢迎大家交流学习 ] 30 | 31 | 没有太多的时间精力, 故暂时中断. 32 | 33 | ... 34 | 35 | 看到一篇非常棒的语法分析器(来自于[niuox](http://my.csdn.net/niuox)大神), 故将其源码转存于此, 说明文档如下 36 | 37 | 38 | 39 | ## 语法分析器 40 | 41 | [注: Source中lexSynAnalysis文件夹中的源码来自于[niuox](http://my.csdn.net/niuox)大神] 42 | 43 | 本程序实现一个分析C语言的词法分析+语法分析。 44 | 45 | 注意: 46 | 47 | 1.文法简略,没有实现的部分,可以在此文法的基础上进行扩充,本程序的采用自顶向下的LL(1)文法。 48 | 49 | 2.可以自动实现求First 集和 Follow 集。 50 | 51 | 3.处终结符外(有些硬编码的成分),终结符的文法可以自定义,也就是说读者可以自定义文法。 52 | 53 | 4.为方便理解,C语言的文法描述写成中文。 54 | 55 | 5.程序将词法分析和语法分析结合起来,词法分析的结果作为语法分析的输入。 56 | 57 | 6.最终结果在控制台显示的有:词法分析、First集、Follow集、Select集,在preciateResult.txt 中写入了语法分析结果,在preciateTable.txt 中写入了预测分析表。 58 | 59 | 7.文法的词素之间必须有空格分开。 60 | 61 | 项目结构如下: 62 | 63 | ![img](http://img.my.csdn.net/uploads/201211/23/1353647407_2507.jpg) 64 | 65 | 文法如下: 66 | 67 | wenfa.txt: 68 | 69 | ``` 70 | <函数定义> -> <修饰词闭包> <类型> <变量> ( <参数声明> ) { <函数块> } 71 | <修饰词闭包> -> <修饰词> <修饰词闭包> | $ 72 | <修饰词> -> describe 73 | <类型> -> type <取地址> 74 | <取地址> -> <星号闭包> 75 | <星号闭包> -> <星号> <星号闭包> | $ 76 | <星号> -> * 77 | <变量> -> <标志符> <数组下标> 78 | <标志符> -> id 79 | <数组下标> -> [ <因式> ] | $ 80 | <因式> -> ( <表达式> ) | <变量> | <数字> 81 | <数字> -> digit 82 | <表达式> -> <因子> <项> 83 | <因子> -> <因式> <因式递归> 84 | <因式递归> -> * <因式> <因式递归> | / <因式> <因式递归> | $ 85 | <项> -> + <因子> <项> | - <因子> <项> | $ 86 | <参数声明> -> <声明> <声明闭包> | $ 87 | <声明> -> <修饰词闭包> <类型> <变量> <赋初值> 88 | <赋初值> -> = <右值> | $ 89 | <右值> -> <表达式> | { <多个数据> } 90 | <多个数据> -> <数字> <数字闭包> 91 | <数字闭包> -> , <数字> <数字闭包> | $ 92 | <声明闭包> -> , <声明> <声明闭包> | $ 93 | <函数块> -> <声明语句闭包> <函数块闭包> 94 | <声明语句闭包> -> <声明语句> <声明语句闭包> | $ 95 | <声明语句> -> <声明> ; 96 | <函数块闭包> -> <赋值函数> <函数块闭包> | <函数块闭包> | <条件语句> <函数块闭包> | <函数返回> <函数块闭包> | $ 97 | <赋值函数> -> <变量> <赋值或函数调用> 98 | <赋值或函数调用> -> = <右值> ; | ( <参数列表> ) ; 99 | <参数列表> -> <参数> <参数闭包> 100 | <参数闭包> -> , <参数> <参数闭包> | $ 101 | <参数> -> <标志符> | <数字> | <字符串> 102 | <字符串> -> string 103 | -> for ( <赋值函数> <逻辑表达式> ; <后缀表达式> ) { <函数块> } 104 | <逻辑表达式> -> <表达式> <逻辑运算符> <表达式> 105 | <逻辑运算符> -> < | > | == | != 106 | <后缀表达式> -> <变量> <后缀运算符> 107 | <后缀运算符> -> ++ | -- 108 | <条件语句> -> if ( <逻辑表达式> ) { <函数块> } <否则语句> 109 | <否则语句> -> else { <函数块> } | $ 110 | <函数返回> -> return <因式> ; 111 | ``` 112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /source/lexAnalysis/analyse.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thy-chan/Chan-s-C-Compiler/c7c1734fcdac1998a556cdb662198bcb0d7e74f4/source/lexAnalysis/analyse.c -------------------------------------------------------------------------------- /source/lexAnalysis/text.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int fibonacci(int i) { 4 | if (i <= 1) { 5 | return 1; 6 | } 7 | return fibonacci(i-1) + fibonacci(i-2); 8 | } 9 | int main() 10 | { 11 | int i; 12 | i = 0; 13 | while (i <= 10) { 14 | printf("fibonacci(%2d) = %d\n", i, fibonacci(i)); 15 | i = i + 1; 16 | } 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /source/lexSynAnalysis/LexAnalysis.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thy-chan/Chan-s-C-Compiler/c7c1734fcdac1998a556cdb662198bcb0d7e74f4/source/lexSynAnalysis/LexAnalysis.cpp -------------------------------------------------------------------------------- /source/lexSynAnalysis/LexAnalysis.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thy-chan/Chan-s-C-Compiler/c7c1734fcdac1998a556cdb662198bcb0d7e74f4/source/lexSynAnalysis/LexAnalysis.h -------------------------------------------------------------------------------- /source/lexSynAnalysis/SynAnalysis.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thy-chan/Chan-s-C-Compiler/c7c1734fcdac1998a556cdb662198bcb0d7e74f4/source/lexSynAnalysis/SynAnalysis.cpp -------------------------------------------------------------------------------- /source/lexSynAnalysis/SynAnalysis.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thy-chan/Chan-s-C-Compiler/c7c1734fcdac1998a556cdb662198bcb0d7e74f4/source/lexSynAnalysis/SynAnalysis.h -------------------------------------------------------------------------------- /source/lexSynAnalysis/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thy-chan/Chan-s-C-Compiler/c7c1734fcdac1998a556cdb662198bcb0d7e74f4/source/lexSynAnalysis/main.cpp -------------------------------------------------------------------------------- /source/lexSynAnalysis/test.txt: -------------------------------------------------------------------------------- 1 | int main() 2 | { 3 | int i = 7; 4 | int j = 9; 5 | int c[20] = 6 | 7 | {2,10,10,19,3,4,5,5,34,6,54,52,34,55,68,10,90,78,56,20}; 8 | for (i=0;i<20;i++) 9 | { 10 | for(j=i+1;j<20;j--) 11 | { 12 | if(j == 19) 13 | { 14 | c[i] = j; 15 | } 16 | } 17 | } 18 | printf("Hello world"); 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /source/lexSynAnalysis/wenfa.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thy-chan/Chan-s-C-Compiler/c7c1734fcdac1998a556cdb662198bcb0d7e74f4/source/lexSynAnalysis/wenfa.txt --------------------------------------------------------------------------------