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

资源简介

设计并实现 C 语言的词法分析程序,要求如下。 (1) 可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。 (2) 可以识别并读取源程序中的注释。 (3) 可以统计源程序中的语句行数、单词个数和字符个数,其中标点和空格不计算为单词,并输出统计结果。 (4) 检查源程序中存在的非法字符错误,并可以报告错误所在的行列位置。 (5) 发现源程序中存在错误后,进行适当的恢复,使词法分析可以继续进行,通过一次词法分析处理,可以检查并报告源程序中存在的所有词法拼写错误。

资源截图

代码片段和文件信息

/***********************************************************/
/*                  词法分析程序的设计与实现               */
/***********************************************************/
#include 
#include 
#include 
#include 
#include  
using namespace std;
const int BUFF=4096;            //设置缓冲组大小 
char buffer[BUFF];
int beginforward;
int line=1character=1word=0;   //用于统计 
int rownum=0;                    //记录列数 

char get_char(ifstream & insofstream & outs);     //从缓冲区读入一字符 
char get_nbc(ifstream & insofstream & outs);      //从缓冲区读入一非空白符 
void retract();                                    //向前扫描指针forward后退一个字符
int reserve(string test);                          //查保留字表

int main()
{
 
    int i;
    int iskey;               //存放reserve()的返回值 

    char c;
    string token;            //存放单词的字符串
    ifstream ins;            //打开输入和输出文件 
    ins.open(“in.txt“);
    ofstream outserr;
    outs.open(“out.txt“);
    err.open(“err.txt“);      //打开错误输出文件 
    outs << setw(-30) << “正规表达式“ << setw(25) << “记号“ << setw(30) <<“属性\n\n“;
    buffer[BUFF/2-1]=EOF;     //设置两个标志位
    buffer[BUFF-1]=EOF;
    
    begin=forward=0;          //初始两个指针 
    
    
    c=ins.get();
    i=0;
    while(c!=EOF&&i    {
        buffer[i]=c; 
        c=ins.get();  
        i++;
    }
    buffer[i]=EOF;  
    
    token=““;                    //初始化      
    c=get_nbc(insouts);
        
    int flag=1;
    while(c!=EOF){
    switch(c)
    {
          case ‘a‘...‘z‘:         //判断标识符是否为关键字 
          case ‘A‘...‘Z‘:
          case ‘_‘:
               flag=1 ;              
               while(isalpha(c)||isdigit(c)||c==‘_‘)
               {
                   token+=c;
                   c=get_char(insouts);
                   if (c==‘@‘||c==‘‘‘||c==‘$‘||c==‘?‘)
                   {
                              err<< token << c << “  “ << “ERROR!非法标识符。位置:第“ << line << “行,第“<< rownum << “列\n“;
                              word--;
                              while(c!=‘\n‘&&c!=‘ ‘&&c!=‘\t‘)             //跳过非法字段继续向下分析                                     
                                              c=get_char(insouts);
                              flag=0;
                               retract();                                                                                      
                   }                   
               }
               word++; 
               if(flag)
               {retract();               
               iskey=reserve(token);
               if(iskey==0)
               { 
                   outs << setw(5)<< token << setw(28) << “id“ << setw(40) << setw(40) << “*identifier_table_entry\n“;   //标识符 
                   token=““;
               }
               else 
               {
                   outs << setw(5) << token << setw(28) << token << setw(30) << “-\n“;        //若是关键字,则直接输出此关键字 
             

评论

共有 条评论