Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1809434
  • 博文数量: 195
  • 博客积分: 4227
  • 博客等级: 上校
  • 技术积分: 2835
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-04 10:39
文章分类

全部博文(195)

文章存档

2013年(1)

2012年(26)

2011年(168)

分类: C/C++

2012-01-12 14:51:11

1.           前言

在前一段时间,没有办法自己编写一简单ASM编译器,针对于某一特定的应用而开发的,其中最头疼的无非与语法解释以及词法解释,在考虑到开发周期采用了YACCLex相结合的办法来实现。鄙人记性不是太好故将以前知识记录下来以做备忘。在该该文中并没有理论的讲解,因为鄙人也是半路出家,无法从理论的高度去解释,只能用自己的实际来讲述。

2.           工具

古人云:工欲善其事,必先利其器。在这里采用了做为工具。

如何安装以及如何使用在http://hi.baidu.com/chenwenyu05/blog/item/d80d0cfabc2535889e514697.html中有很好的讲述,在这里不再赘述。

3.           Open

当新建一个Parser 工程时,会自动生成两个文件xx.lxx.y两个文件。其中xx.l用于词法解释,用来分析词法,xx.y用来语法解释。(默认采用C语言,平台为VC6.0

 

%{

/*******************************************************************

xx.l  .

Date: 2012112

*****************************************************************/

#include "xx.h"

%}

//上面为第一部分,该部分会在生成xx.c文件时,自动复制过去,其code编写与C文件的前部分编写一致,包括包含某些特定文件以及定义一些全局变量

/////////////////////////////////////////////////////////////////////////////

// declarations section

// place any declarations here

%%

//上面为第二部分,为声明区

/////////////////////////////////////////////////////////////////////////////

// rules section

// place your Lex rules here

%%

//上面为第三部分,为规则区

/////////////////////////////////////////////////////////////////////////////

// programs section

            //该部分则是代码区,该部分的code也会直接copyxx.c中。Parser并不会对其做出任何处理。

                   观察上述ParserWizard生成的Lex文件,你会发现其是由四个部分组成,采用%%

                   分割。

                  3.2 当第一次打开xx.l

%{

/******************************************************************

xx.y  ParserWizard generated YACC file.

Date: 2012112

********************************************************************/

#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.yxx.l的格式区别不大,是这样的。这两个文件在内容分布上是一致的,头尾均是直接copy到对应文件,而中间则是词法分析和语法分析的核心,比如设计规则以及定义关键字等操作。

 

阅读(1550) | 评论(0) | 转发(0) |
0

上一篇:C++编程小记

下一篇:回首默然

给主人留下些什么吧!~~