分类: C/C++
2012-01-12 14:51:11
1. 前言
在前一段时间,没有办法自己编写一简单ASM编译器,针对于某一特定的应用而开发的,其中最头疼的无非与语法解释以及词法解释,在考虑到开发周期采用了YACC和Lex相结合的办法来实现。鄙人记性不是太好故将以前知识记录下来以做备忘。在该该文中并没有理论的讲解,因为鄙人也是半路出家,无法从理论的高度去解释,只能用自己的实际来讲述。
2. 工具
古人云:工欲善其事,必先利其器。在这里采用了做为工具。
如何安装以及如何使用在http://hi.baidu.com/chenwenyu05/blog/item/d80d0cfabc2535889e514697.html中有很好的讲述,在这里不再赘述。
3. Open
当新建一个Parser 工程时,会自动生成两个文件xx.l和xx.y两个文件。其中xx.l用于词法解释,用来分析词法,xx.y用来语法解释。(默认采用C语言,平台为VC6.0)
%{
/*******************************************************************
xx.l .
Date: 2012年1月12日
*****************************************************************/
#include "xx.h"
%}
//上面为第一部分,该部分会在生成xx.c文件时,自动复制过去,其code编写与C文件的前部分编写一致,包括包含某些特定文件以及定义一些全局变量
/////////////////////////////////////////////////////////////////////////////
// declarations section
// place any declarations here
%%
//上面为第二部分,为声明区
/////////////////////////////////////////////////////////////////////////////
// rules section
// place your Lex rules here
%%
//上面为第三部分,为规则区
/////////////////////////////////////////////////////////////////////////////
// programs section
//该部分则是代码区,该部分的code也会直接copy到xx.c中。Parser并不会对其做出任何处理。
观察上述ParserWizard生成的Lex文件,你会发现其是由四个部分组成,采用%%
分割。
3.2 当第一次打开xx.l
%{
/******************************************************************
xx.y ParserWizard generated YACC file.
Date: 2012年1月12日
********************************************************************/
#include "xx.h"
%}
/////////////////////////////////////////////////////////////////////////////
// declarations section
// attribute type
%include {
#ifndef YYSTYPE
#define YYSTYPE int
#endif
}
// place any declarations here
%%
/////////////////////////////////////////////////////////////////////////////
// rules section
// place your YACC rules here (there must be at least one)
Grammar
: /* empty */
;
%%
/////////////////////////////////////////////////////////////////////////////
// programs section
int main(void)
{
return yyparse();
}
你会发现xx.y与xx.l的格式区别不大,是这样的。这两个文件在内容分布上是一致的,头尾均是直接copy到对应文件,而中间则是词法分析和语法分析的核心,比如设计规则以及定义关键字等操作。