• 大小: 210KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-07-25
  • 语言: C/C++
  • 标签: 词法分析  

资源简介

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

资源截图

代码片段和文件信息

#include 
#include 

char set[1000];  /*用于存放代码,以字符形式存放*/
char str[500];   /*用于存放预处理过的代码*/
char strtoken[20];  /*用于暂时存放字符串*/
char ch;
int srto;

typedef struct keytable    /*放置关键字*/
{
    char name[20];
    int  kind;
}KEYTABLE;

KEYTABLE keyword[]={      /*设置关键字*/                      
                      {“if“1}
                      {“int“1}
                      {“for“1}
                      {“while“1}
                      {“do“1}
                      {“return“1}
                      {“break“1}
                      {“continue“1}                      
                      {“default“2}
                    };

KEYTABLE arr1[10]={
{“+“4}
{“-“4}
{“*“4}
{“/“4}
{“=“4}
{“<“4}
{“>“4}
{“!“4}

};
KEYTABLE arr2[10]={
{““5}
{“;“5}
{“{“5}
{“}“5}
{“(“5}
{“)“5}
};

void openfile()   /*打开文件*/
{
  FILE *fp;
  char filename[10];
  int n=0;
  printf(“请输入源文件名(包括路径和后缀名):“);
  gets(filename);
  if((fp=fopen(filename“r“))==NULL)
    {
      printf(“无法打开该文件!!!请确认该文件存在!\n“);
    }
  else
      while(!feof(fp))  /*文件不结束,则循环*/
       {
         set[n]=getc(fp);   /*文件的每一个字符都放入set[]数组中*/
         n++;
       }
  fclose(fp);            /*关闭文件*/
  set[n-1]=‘\0‘;
  printf(“\n-------------------Source Code--------------------------\n“);
  puts(set);
  printf(“\n--------------------------------------------------------\n“);
}

void prearrange()   /*预处理程序,主要用于去除连续空格和换行符*/
{
    int j=0;
    sr=0;    /*全局变量sr是str[]的指示器*/
    while(set[j]!=‘\0‘)
    {
    if(set[j]==‘ ‘ || set[j]==‘\n‘)
        {
           while(set[j]==‘ ‘ || set[j]==‘\n‘) /*扫描到有连续的空格或换行符*/
                 j++;
           str[sr]=‘ ‘;    /*用一个空格代替扫描到的连续空格和换行符放入str[]*/
           sr++;
        }
    else
       {
         str[sr]=set[j];  /*若当前字符不为空格或换行符就直接放入str[]*/
         sr++;
         j++;
       }
    }
    str[sr]=‘\0‘;
}

void GetChar()
{
//do
//{
ch=str[sr++];
//}while(ch==‘ ‘);
}

void Concat()
{
   strtoken[to]=ch;
   to++;            /*全局变量to是strtoken的指示器*/
   strtoken[to]=‘\0‘;
}
void panduan(){//判断双运算符

if(ch==‘>‘){
GetChar();
  if((ch==‘>‘)||(ch==‘=‘))
      Concat();
  else{ sr=sr-2;//回滚
  GetChar();}
}else if(ch==‘<‘){
GetChar();
  if((ch==‘<‘)||(ch==‘=‘))
      Concat();
  else{    sr=sr-2;
  GetChar();}
  
}else if(ch==‘!‘){
GetChar();
  if(ch==‘=‘)
      Concat();
  else{ sr=sr-2;
  GetChar();}
      
}else if(ch==‘=‘){
GetChar();
  if(ch==‘=‘)
      Concat();
  else{  sr=sr-2;
  GetChar();}
     
}


}
int Reserve()  /*对strtoken中的字符串查找保留字表,若是则返回它的编码,否则返回0*/
{
   int ik=1; 
   for(i=0;i<=20;i++)
     {
       if(strcmp(strtokenkeyword[i].name)==0)
         { 
   k=0;           
           return(keyword[i].kind);
         }
     }
   if(k)
      return 0;
}

int Reserve2()
{

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      74240  2011-05-11 00:06  编绎实验1报告.doc

     文件      57344  2010-06-14 10:07  实验一 词法分析.doc

     文件       4893  2011-05-10 22:50  my\my01.cpp

     文件       3377  2011-05-10 18:54  my\my01.dsp

     文件        516  2011-05-10 23:49  my\my01.dsw

     文件      41984  2011-05-10 23:49  my\my01.ncb

     文件      48640  2011-05-10 23:49  my\my01.opt

     文件        736  2011-05-10 23:45  my\my01.plg

     文件     180303  2011-05-10 23:45  my\Debug\my01.exe

     文件     214212  2011-05-10 23:45  my\Debug\my01.ilk

     文件      13851  2011-05-10 23:45  my\Debug\my01.obj

     文件     217468  2011-05-10 19:23  my\Debug\my01.pch

     文件     459776  2011-05-10 22:50  my\Debug\my01.pdb

     文件      33792  2011-05-10 23:45  my\Debug\vc60.idb

     文件      53248  2011-05-10 22:50  my\Debug\vc60.pdb

     目录          0  2011-05-10 23:49  my\Debug

     目录          0  2011-05-10 23:49  my

----------- ---------  ---------- -----  ----

              1404380                    17


评论

共有 条评论