编译器构造:词法分析器代码详细讲解

本文详细介绍了编译器中词法分析器的工作原理,包括扫描器的实现、词法记号的分类与存储,以及错误处理策略。词法记号主要分为标识符、关键字、常量和界符四类。通过枚举类型记录词法记号标签,并为特殊词法记号如标识符、常量保存额外信息。错误处理主要涉及词法错误的报告和位置信息。此外,还涵盖了数字常量、字符常量、字符串常量的识别规则,以及注释和界符的处理方式。
摘要由CSDN通过智能技术生成
  1. 词法分析的功能
    词法分析是编译器处理流程中的第一步,它顺序扫描文件内的字符,通过硬编码方式解析器进行匹配,产生各式各样的词法记号。
    在这里插入图片描述

  2. 扫描器
    扫描器读取源文件年,按序返回文件内的字符,直到文件结束。为了节省IO开销,解释用缓冲区结构。
    在这里插入图片描述

#define BUFFEN 100  //缓冲区大小
int len_data = 0;   //缓冲区数据长度
int readIndex = -1; //读取位置下标
char buffer[BUFFEN];  //缓冲区
int rowlNum = 0; //行号
int colNum = 0; //列号 设置行号和列号的原因为了报错信息
char priorchar ; //上一个字符

char scan(FILE *file)
{
   if(!file)           //如果文件不存在
      return -1;
   if(readIndex==len_data-1)  //缓冲区数据已经读取完毕或者为空
   {
      len_data = fread(buffer,1,BUFFEN,file);  //加载新的数据
      if(len_data==0)    //源文件已经读取完毕
      {
         len_data=1;      //设置数据长度为一,因为文件结束标记占一位
         buffer[0]=-1;    //文件结束标记
      }
      readIndex=-1;  //恢复初始读取位置
   }
   readIndex++;    //读取下一个字符
   char ch = buffer[readIndex];
   if(priorchar=='\n')   //读取新行
   {
      rowNum++:        //行号加一
      colNum=0;        //列号清零
   }
   if(ch==-1)   //文件结束
   {
      fclose(file);
      file=NULL;
   }
   else if(chh!='\n')
      colNum++;              //列号加一
   priorchar = ch;
   return ch;
}
  
  1. 词法记号
    词法记号通常可以分为标识符、关键字、常量、界符四大类。
    在这里插入图片描述
    在这里插入图片描述

我们使用一个枚举类型记录所有的词法记号标签,为后面的代码提供符好定义。

enum Tag
{
   ERROR,     //错误异常
   END,       //文件结束标记
   ID,       //标示符
   NUM,CHAR,STR,    //常量
   KW_INT,KW_CHAR,KW_VOID,  //数据类型
   KW_EXTERN,   //extern
   NOT,LEA,   //单目运算符
   ADD,SUB,MUL,DIV,MOD, //算法运算符
   INC,DEC,   //自加自减
   GT,GE,LE,LE,EQU,NEQU,  //比较运算符
   AND,OR,  //逻辑运算符
   LPAREU,RPAREN,   //()
   LBRACK,RBRACK,    //[]
   LBRACE,RBRACE,    //{}
   COMMA,COLON,SEMICON,  //逗号,冒号,分号
   ASSIGN,  //赋值
   KW_IF,KW_ELSE,   //if else
   KW_SWITCH,KW_CASE,KW_DEFAULT,
   KW_WHILE,KW_DO,KW_FOR,  //循环
   KW_BREAK,KW_CONTINUE,KW_RETURN  //break,continue,return
};

词法记号标签只是区分了不同的词法记号,对于标示符、常量等特殊词法记号除了需要保存词法记号标签信息外,还要保存标示符名称、常量值等信息,以用来构造符号表。
在这里插入图片描述

基类Token表示一般的词法记号,它只包含一个公有字段tag,用于记录词法记号的标签,Token有四个派生类Id、Num、Char、Str,分别对应标示符、数字常量、字符常量、字符串常量。Id公有字段name记录标识符的名称,Num的公有字段val记录了数字常量的值&#

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值