博客首页 | 排行榜 |

萤火虫的博客

沒有月亮,我們可以看星光;失去星光,還有溫暖的眼光;抱著希望,等待就少點感傷;彷彿不覺

个人档案
博文分类
[FPGA博客大赛]硬件软件化之mcu软核编程[2]   2010-02-21 14:00

pbasm的词法分析前端flex:
作为一个基本的编译器,需要有一些基本的要素,词法分析,语法分析以及指定格式的输出。今天讨论一下
pbasm的词法分析部分,也就是用户源文件的输入处理。经过几天flex帮助文件的学习,对它的运行原理有一些基本了解。
flex是fast lex的简称,而lex又是词法英语的缩写。所以从字面上看,flex就是一个快速的词法分析工具,它是基于
linux,如果你安装了linux,可以直接输入info flex查看它的完整手册。不过我安装的是window下的cygwin,但是在命
令行和linux一样操作。这个工具可以将用户指定的词法规则转换成c语言源文件,并参与编译器的编译。它的词法文件一般
会以.l结尾,运行flex后会生成lex.yy.c文件,这两个文件都包含在pbasm源文件夹中,我们可以实际操作一下,删除lex.yy.c
文件,在命令行输入:
flex pbasm.l
再察看目录,发现生成了一个新的lex.yy.c文件,和源文件夹里的那个lex.yy.c比较,一模一样,不过在cygwin下编译pbasm
时,还要加上一下封装函数的声明:
int yywrap()
{
   return(1);
}
flex的词法规则文件介绍:
这个文件通常由三部分组成,并且用%%隔开:

定义
%%
规则
%%
用户代码

定义:这个部分主要是一些要包含的头文件,宏定义.以下的例子包含了C语言的基本库和定义了一个数字模板,以后就可以直接
用DIGIT来代替这个数字的模式了.

#include
#include
DIGIT [0-9]

规则:这个部分又分为2部分,中间以空格隔开:
模式 行为
其中模式就是lex词法定义的一些规则了,行为是当输入数据符合前面的模式时,需要执行的动作,其实就是一些c语言代码组成的.
下面是一些常用的模式符号:
x       匹配字符x
.       匹配任何字符,除了换行.
[XYZ]   XYZ三个字符里的任何一个.
[A-Z]   26个大写字母里的任何一个.
[^A-Z\n] 除了大写字母或新行以外的任何一个字符.
[a-z]   任何一个小写字母.
r*      0个或多个r的连接.
r+      1个或多个r的连接.
r?      0个或1个r的连接.
用户代码:这个部分主要是提供给main函数空间的,不过我们的pbasm有自己的文件,所以这部分就没怎么使用.
关于flex知道这么多对分析pbasm来说应该也可以了,说明文档还有很多内容,有兴趣也可去看.
现在,来打开pbasm.l文件,用我们刚了解的知识学习一下,整个文件不到100行,还有20多行的注释,真可称得上短小精悍呀,
按照规则文件的划分,第一部分,它没有什么定义,只是一些注释和头文件,这些在生成c语言源文件时,都会被原封不动的拷过去,
第二部分最主要,一共有6条规则,这也意味着我们的编译器会从输入源文件里最多区分出6种不同的模式匹配.下面我们一个一个看:
第一条规则,是由两个模式或起来的,第一个模式是表示一个8位的16进制数,由两个半字节匹配,第二个模式表示10位的
16进制数,最大为3ffh,正好和1k的指令存储空间对应.这两个模式要匹配的是源代码里的数值.所要执行的动作是将文本数字
转换成数字放入变量中,然后返回16进制数值这个类型.
第二条规则定义了字符串的模式,第一个字符必须是下划线或字母,后面的可以是字母或数字.这个字符串可以是指令名,寄存器
名或标号,这里只负责把它作为字符串识别出来.这条规则的动作为:在符号表中查找这个串,如果存在,返回相应的类型,否则
作为标号添加到符号表中,并返回标号相应的类型.
第三条规则是处理白空格,也就我们所说的tab健,它的可打印字符表示是\t,这里只是简单的追加到行后,然后忽略之.
第四条规则是处理注释,从这里我们可以看到,pbasm可识别的注释格式:是以;开始的多个任何字符组成的字符串.它的处理动作和上一条
一样,所以这两条规则其实是可以合并到一起的.
第五条规则是处理回车换行的,换行的可打印字符是\n,它的处理行为是调用的外部函数line_finish进行相应的操作.
第六条规则是处理除了上面规定的模式外的,有一个字符构成的情况,它只是简单的返回这个字符的值给后面过程处理.
在将规则文件转成c语言文件后,flex输出的一个主要接口就是yylex(),这个函数提供给后面诸如语法分析器的进一步分析.
关于编译器的词法部分,到这就分析完了,下一次我试图介绍语法分析给大家.

类别:fpga |
上一篇:[FPGA博客大赛]硬件软件化之mcu软核编程[3]  | 下一篇:[FPGA博客大赛]硬件软件化之mcu软核编程[1]
以下网友评论只代表其个人观点,不代表本网站的观点或立场