Flex 和 Bison 使用方法
背景知识在学编译原理的时候,同时在做南京大学的编译原理课程实验,这里是链接,整个实验的效果是实现一个完整的 Flex 和 Bison 是两个在编译前期最常实验的工具,分别是用来做 lexical analyse 和 semantic analyse 的,这两个工具的使用基本不需要很深的编译知识,只需要掌握正则表达式的书写(lexical analyse阶段使用)和上下文无关文法(semantic analyse 阶段使用),就可以完成这两个阶段的分析了。 Flex大体介绍Flex 主要是用在词法分析阶段,不需要我们去手写分析器,只需要制定好相应的正则表达式规则,他可以自动对输入文件进行词法分析。 Flex 主要在 Linux 系统下工作,安装方式也很简单。
安装好 flex 之后,我们创建一个 definitions %% rules %% user subroutines 在编写好文件后,可以使用命令 我们可以在外部定义一个自己的 主要的代码框架如下 extern File* yyin; int main(int argc,char ** args) { if (argc > 1) { if( ! (yyin = fopen(argv[1],"r"))) { perror(argv[1]); return 1; } } while(yylex()!= 0); return 0; } 这个 yyin 可以理解成输入文件的文件指针,用来读取文件,在 然后我们进行整体的编译
-lfl 参数是指定一个库函数,对于 MacOS 用户,可以使用 -ll 参数进行代替。 这样之后,对某个文件进行词法分析就可以直接运行 Flex 规则部分我们需要注意的是对 Flex 中的规则的编写,整个 FLex 文件分别由三个部分,第一个部分通常定义一些之后常用的正则表达式,可以简化书写,定义格式为: name definition
digit [0-9] 这个 第二部分是规则部分,即针对每一个特定的语法单元,我们对其有什么样的操作。定义格式为 pattern {action} 这个 第三部分是用户自定义的代码部分,而这部分定义的方法,函数,都应该在第一部分中进行声明,声明格式为 %{ %} 这样,声明后的变量,函数和自定义的代码片段都会在 完成了这三个部分后,我们就可以生成一个简单的语法分析器了。下面给出一个使用 flex 进行单词统计的完整文件。 %{ int chars = 0; int words = 0; int lines = 0; %} letter [a-zA-Z] %% {letter}+ {words ++; chars += yyleng; } n {chars++; lines ++;} . {chars++;} %% int main(int argc,char** argv) { if (argc > 1) { if (!(yyin = fopen(argv[1],"r"))) { perror(argv[1]); return 1; } } yylex(); printf("lines are %d words are %d chars are %dn",lines,words,chars); return 0; } 这里的 这样,整个词法分析的过程就结束了,我们可以输入对应的词法流,在语法分析阶段进行下一步的分析。而语法分析所用的工具,就是 bison。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |