动手实现编译器(一)——词法分析

本文介绍了一个简单词法分析器的设计与实现过程,该分析器能够处理基本的数学运算符和十进制整数,通过扫描输入文件识别出单词符号,并将其转换为内部编码形式。

第一部分:词法分析

我们从一个简单的词法分析器开始我们的编译器编写。词法分析器的工作是依次扫视字符串形式源程序中的各个字符,逐个识别出其中的单词,并将其转换为内部编码形式的单词符号串作确为输出。

从简单的单词开始:

五个基本的数学运算符(*,/,+,-,% )和十进制整数(0…9)

扫描到的每个单词都将存储在此结构中:

// 单词结构体
struct token 
{
   
   
	int token;
	int intvalue;
};

其中 token 字段可以为以下值之一:

enum
{
   
   
 	T_EOF, T_ADD, T_SUB, T_MUL, T_DIV, T_MOD, T_INT
};

它们分别代表:"EOF","+", "-", "*", "/", "%", "int"
当 token 为 T_INT 时,即单词为整数时,intvalue=整数值

核心代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>

// 单词类型
enum
{
   
   
    T_EOF, T_ADD, T_SUB, T_MUL, T_DIV, T_MOD, T_INT
};

// 单词结构体
struct token
{
   
   
    int token;
    int intvalue;
};

int scan(struct token *t);

// data.h
int     Line; //当前读入行数
int	    Putbackchr;
FILE    *Infile;

// 返回字符 c 在字符串 s 中的位置,如果没有找到 c,则返回 -1
int get_chrpos(char *s, int c)
{
   
   
    char *p;
    p = strchr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值