手撸词法分析器(C/C++)

一.背景

这学期开设了编译原理,要求写个基本的词法分析器。所以博主就自己写了一份代码,也比较简单基础。

二.什么是词法分析器?

简单来说就是能识别基本的符号(+,-,*,/,),关键词(for ,while,return ,int ),数字等。这么说大家应该有个基本了解,那么我们如何写代码呢,这里有个思维图。

在这里插入图片描述
可以大致将单词分成这几类,然后进行判断即可。

三.代码

#include <stdio.h>
#include <string>
#include < fstream >
#include <iostream>
int scan_word(char* buff);
using namespace std;
char buf[102400] = { 0 };
char key[][20] = {"if","else","for","while","do","return","break","continue",
",",";","{","}","(",")",
"+","-","*","/",
"<","<=","=",">=","< ","*=","/=","+=","-=","++",
"int", "char", "float","double","unsigned char","unsigned int","void",
"main"
};

int main()
{   
	ifstream  fin;
	int i =0,j=0,k=0;
    fin.open("demo.txt", ios::in);
	char temp[20] = { 0 };

	if (!fin.is_open())
	{
		cout << "读取文件失败" << endl;
		return 1;
	}
	while ((buf[i++] = fin.get()) != EOF);
	buf[i] = '\0';

	while (j < i-2)
	{   
		start:
		if (buf[j] == 0x0a || buf[j] == 0x0d || isspace(buf[j]))
		 {
			 j++;
			goto start;
		 }
		//字母
		else if ((buf[j] >= 65 && buf[j] <= 90) || (buf[j] >= 97 && buf[j] <= 122))
		{
			while ((buf[j] >= 65 && buf[j] <= 90) || (buf[j] >= 97 && buf[j] <= 122)|| ((buf[j] >= 48 && buf[j] <= 57))||buf[j]==95)
			{
				temp[k++] = buf[j++];
				
			}	
			 
				temp[k] = '\0';
				k = 0;
				scan_word(temp);
		}
		//数字
		else if ((buf[j] >= 48 && buf[j] <= 57))
		{
			while (buf[j] >= 48 && buf[j] <= 57)
			{
				temp[k++] = buf[j];
				j++;
			}
			if (buf[j] == '.')
			{
				temp[k++] = buf[j];
				j++;
			}
			
			while (buf[j] >= 48 && buf[j] <= 57)
			{
				temp[k++] = buf[j];
				j++;
			}
			temp[k] = '\0';
			k = 0;
			printf("\(51,\"\%s\"\)\n", temp);
			//scan_word(temp);

		}
	 	//其他符号
		else 
		{ 
			if(buf[j]=='>'||buf[j]=='='||buf[j]=='<' || buf[j] == '+'|| buf[j] == '-' || buf[j] == '*'||buf[j] == '/')
		    {
				if (buf[j + 1] == '=')
				{
					temp[0] = buf[j++];
					temp[1] = buf[j++];
					temp[2] = '\0';
				}
				if (buf[j + 1] == '+')
				{
					temp[0] = buf[j++];
					temp[1] = buf[j++];
					temp[2] = '\0';
				}
				else goto end;
		    }
		 
			else
			{  
			end:
				temp[0] = buf[j++];
				temp[1] = '\0';
				
			}
			scan_word(temp);
		}
		
	}

}
int scan_word(char *buff)
{   
	for (int i = 0; i < 31; i++)
	{
		if (strcmp(buff, key[i]) == 0)
		{	
			printf("\(%d,\"\%s\"\)\n",i,buff); 
			return 1;
		}
	}
	
	printf("\(50,\"\%s\"\)\n", buff);
	return 0;
}

四.思考

这只是一个简单的词法分析器,很多功能都不完善,你们也可以自己添加代码改善一下。

相关推荐

  1. Swift轮播效果

    2024-04-21 02:56:06       29 阅读
  2. 如何一个springMVC框架

    2024-04-21 02:56:06       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 02:56:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 02:56:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 02:56:06       87 阅读
  4. Python语言-面向对象

    2024-04-21 02:56:06       96 阅读

热门阅读

  1. konva.js 工具类

    2024-04-21 02:56:06       31 阅读
  2. 设计模式(分类)

    2024-04-21 02:56:06       36 阅读
  3. OpenXR API概览与核心组件解析

    2024-04-21 02:56:06       36 阅读
  4. NLP和LLMs: 理解它们之间的区别

    2024-04-21 02:56:06       35 阅读
  5. Oracle中的时间戳转换与使用

    2024-04-21 02:56:06       36 阅读
  6. Android开发学习(1)--楔子

    2024-04-21 02:56:06       37 阅读
  7. [论文笔记] megatron训练参数:dataloader_type

    2024-04-21 02:56:06       32 阅读
  8. Blender3.6下载地址

    2024-04-21 02:56:06       37 阅读
  9. 前端遇到的问题

    2024-04-21 02:56:06       35 阅读
  10. Oracle存储过程的使用与实例

    2024-04-21 02:56:06       34 阅读