一个小语言的词法分析程序原理及其实现(2)

原创 2004年03月22日 16:13:00

(接上篇)根据这个表来构造程序,程序的核心是下面的这个函数,<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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

以下为主分析函数

从输入文件里面读,把分析结果写到输出文件中

参数:fpin :输入文件指针  fpout: 输出文件指针

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

void parse(FILE* fpin,FILE* fpout)

{

       char arr[MAXBUF];//读出的最长的字符串不超过MAXBUF,MAXBUF定义为255,够长了我想

int i=0;//分析含字母的字符串用

       int j=0;//分析纯数字的字符串用

    

 

       while(1)

       {

       fscanf(fpin,"%c",&ch);//从输入文件中读入一个字符

 

              if( ch==' '|| ch =='/t')//过滤掉空格和tab

                     ;

              else if( ch=='/n')//回车换行符,为下面进行错误判断

                     lineno++;

              else if( IsDigit(ch))//读入的是数字

              {

                     while(IsDigit(ch))

                     {

                             

                            arr[j] = ch;

                            j++;

                            fscanf(fpin,"%c",&ch);

                           

                     }

                    

                  fseek(fpin,-1L,SEEK_CUR);//文件指针后退一个字节

 

                     char* temp1 =(char*)malloc(j+1);/

                     memcpy(temp1,arr,j);

                     temp1[j] ='/0';//把数组里面的内容拷贝到连外一个数组里面,因为我定义的

                     //arr255个字节,实际上写不到那么多,所以只拷贝实际上有数据的

 

                     j=0;//恢复初始状态,以备下次使用

                     fprintf(fpout,"%s/t/t%d/n",temp1,2);//常数

             

                     free(temp1);//释放内存

                 

                    

              }

 

              else if(IsAlpha(ch))//是字母开头的

              {

             

                     while(IsAlpha(ch) || IsDigit(ch))

                     {

                            arr[i] =ch;

                            i++;

                            fscanf(fpin,"%c",&ch);

                           

                     }

                     fseek(fpin,-1L,SEEK_CUR);

                    

                     char* temp = (char*)malloc(i+1) ;

                     memcpy(temp,arr,i);

                     temp[i] ='/0';

 

                     i=0;

                     /*基本思想同处理数字的*/

             

          if(FindOK(temp))//FindOK函数在关键字表中查找和temp字符串相同的,找到就返回类别编号

                {

                      

                      fprintf(fpout,"%s/t/t%d /n",temp,FindOK(temp));

                      

                }

                else

                {

                       fprintf(fpout,"%s/t/t%d/n",temp,1);//标示符号

                      

                }

                free(temp);

              }

      

              //以下为2字节的运算符号

              else if( ch==':')//符号“:=”

              {

                     fscanf(fpin,"%c",&ch);

                     if(ch=='=')

                            fprintf(fpout,"%s/t/t%d/n",":=",20);

                    

              else       

                     fprintf(fpout,"error in compileing %d lines unknown character %c /n",lineno,ch);//出错了

              }

 

              else if(ch=='>')//符号 > “ 和”>=”

              { 

                     fscanf(fpin,"%c",&ch);

                     if(ch=='=')

                     fprintf(fpout,"%s/t/t%d/n",">=",16);

                     else

                     fprintf(fpout,">/t/t15/n");

              }

              else if( ch=='<') //符号 < “ 和”<=”

 

              {

                     fscanf(fpin,"%c",&ch);

                     if(ch=='=')

                     {fprintf(fpout,"<=/t/t18/n");}

                     else if( ch=='>')

                     {fprintf(fpout,"<>/t/t19");}

                     else

                     {fprintf(fpout,"</t/t19/n");}

              }

      

 

              else {

            //以下为一个字节的运算符号

              if(ch=='-') {fprintf(fpout,"%s/t/t%d/n",'-',10);continue;}//在文件中输出为“-   10

              if(ch==';') {fprintf(fpout,";/t/t21/n");continue;}

              if(ch=='+') {fprintf(fpout,"+/t/t9/n");continue;}

              if(ch=='*') {fprintf(fpout,"*/t/t11/n");continue;}

              if(ch=='/') {fprintf(fpout,"/ /t/t12/n");continue;}

              if(ch=='(') {fprintf(fpout,"(/t/t13/n");continue;}

              if(ch==')') {fprintf(fpout,")/t/t14/n");continue;}

              if(ch=='.') {fprintf(fpout,"./t/t22/n");continue;}

              if(ch==',') {fprintf(fpout,",/t/t23/n");continue;}

              if(ch=='#') break;//分析结束

              else fprintf(fpout,"error in compiling %d lines unknown character %c /n",lineno,ch);//出错了,输出出错信息

              }

             

       }

      

 

}

以上代码在VISUAL C++6.0 +WIN2000下编译通过.

下面我们用该程序对下面的代码进行词法分析,该代码保存为test.txt,假设编译后的应用程序为lex.exe,

program test

 begin

       3j := 200 ;

if(j > 100) then      

  j := 300&&&&

else

  j := 107870

gyt768%^

 

end. #

在命令行下输入源文件名,test.txt.以及输出文件名:output.txt可以看到下面的结果.

 

program         6

test         1

begin              7

3            2

j             1

:=           20

200         2

;             21

if            3

(             13

j             1

>            15

100         2

)             14

then        4

j             1

:=           20

300         2

error in compiling 4 lines unknown character &

error in compiling 4 lines unknown character &

error in compiling 4 lines unknown character &

error in compiling 4 lines unknown character &

else         5

j             1

:=           20

107870           2

gyt768           1

error in compiling 7 lines unknown character %

error in compiling 7 lines unknown character ^

end         8

.             22

该函数是词法分析程序的核心,它可以识别出源程序中的编写错误,以及找出关键字,变量等.具体请看源代码,注释很详细,但是肯定有不足的地方,请大家不吝赐教。有什么问题,可以给我发邮件。。我的emailbrilliant_zhang@21cn.com,

 

小C语言--词法分析程序

小C语言--词法分析程序 Time Limit: 1000MS Memory Limit: 5000KB Problem Description 小C语言文法  1. →(){} 2. →|| ...
  • guoqingshuang
  • guoqingshuang
  • 2016年09月21日 17:58
  • 4734

编译原理实验一:为PL/0语言编写一个词法分析程序

思路:利用词法分析一章所讲的状态转化图方法,输入源程序,输出单词符号(token)串 1.单词符号类 package lexical_analyzer; public class Token {   ...
  • Code_Thinking
  • Code_Thinking
  • 2015年11月22日 21:01
  • 3354

一个小语言的词法分析程序原理及其实现(1)

             词法分析是编译程序的第一步,是以后编译步骤:语法分析,语义分析以及代码生成的基础.目前可以利用LEX进行词法分析程序的编写,如果所要翻译的语言比较庞大则应该使用LEX,这就需...
  • loyalzu
  • loyalzu
  • 2004年03月23日 09:57
  • 2541

PL/0语言的词法分析程序

要求:1、读入用PL/0语言编写的源程序,正确的进行词法分析,并输出二元式序列。2、若源程序有词法错误,能够给出出错的准确位置。3、词法代号如下(+,+);(-,-);(*,*);(/,/);((,(...
  • iu_81
  • iu_81
  • 2007年07月08日 09:05
  • 1820

c语言词法分析初试(C++实现)

开篇 所谓词法分析,就是将源代码按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等。 分析 源程序分解的单词可以归为以下几类: 1....
  • to_be_better
  • to_be_better
  • 2016年10月08日 19:19
  • 1656

自己动手写编译器之TINY编译器词法分析

TINY是《编译原理与实践》一书中介绍的教学编程语言,该语言缺少真正程序设计语言的主要特征,但足以例证编译器的主要特征了。本文将介绍该编译器的实现过程,完整的实现代码loucomp_linux中,供编...
  • bigconvience
  • bigconvience
  • 2015年05月25日 08:49
  • 5484

PL/0语言词法分析程序(C++版)

#include#include#include#include#includechar* word[]=   {"begin","call","const","do","end","if","odd...
  • cavinlu
  • cavinlu
  • 2005年12月31日 16:21
  • 1235

词法语法语义分析程序

选择部分C语言的语法成分或选择简单语言,采用递归下降的语法制导翻译技术,设计一个一遍扫描的词法语法语义分析程序。 内容:设计并实现一个一遍扫描的词法语法语义分析程序,将多条简单赋值语句翻译成后缀式或...
  • u010435905
  • u010435905
  • 2014年06月05日 10:01
  • 1056

编译原理方面:词法语法语义分析器

实验要求:要求设计出并实现一个一遍扫描的词法语法语义分析程序,将多条简单赋值语句翻译成三地址代码,要求有一定的出错提示和错误恢复功能。...
  • u010265211
  • u010265211
  • 2014年06月04日 22:48
  • 708

编译原理学习:TINY语言词法扫描程序实现

《编译原理及实现》上的TINY语言词法扫描器的实现。并做了如下改善: 1、允许嵌套注释 2、标识符允许出现数字,但是必需以字母开头(和C语言一样)...
  • pdcxs007
  • pdcxs007
  • 2014年10月11日 21:18
  • 4095
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个小语言的词法分析程序原理及其实现(2)
举报原因:
原因补充:

(最多只允许输入30个字)