编译原理词法分析之关键词统计

1、本文中,需要将系统关键词自己首先定义在KeyWord数组中(如18行),这样程序才会自动进行比较;

2、选出某个关键词后,将其code置为0(如26行),避免多次打印该关键词;

3、请自己创建src.txt文件(如65行),并在里面放入一段“你需要统计的语言”代码。

//@Title:词法分析之关键词统计
//@Author:qingdujun
//@FileName:Main.CPP

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 8

//定义关键词结构体
typedef struct KeyWord
{
	char name[30];
	int code;
}KeyWord;

//定义关键词
KeyWord key[N] = {{"void",1},{"int",2},{"while",3},{"char",4},{"include",5},
                  {"typedef",6},{"struct",7},{"return",8}};

int isKeyWord(char *pChar)
{
	int i;
	for (i = 0; i < N; ++i)
	{
		if (0 == strcmp(pChar,key[i].name) && 0 != key[i].code)
		{
			key[i].code = 0;
			return 1;
		}
	}
	return 0;
}
//操作文件
void OpFile(FILE *fp)
{
	int i = 0;
	char ch;
	char buf[30];//缓存

	while (EOF != (ch = fgetc(fp)))
	{
		if ('a' <= ch && 'z' >= ch)
		{
			buf[i++] = ch;
		}
		else
		{
			buf[i] = '\0';
			i = 0;
			if (1 == isKeyWord(buf))
			{//是关键词
				printf("%s、",buf);
			}
		}
	}
	printf("\n");
}

//读取文件
void ReadFile()
{
	FILE *fp = NULL;
	//打开文件
	if (NULL == (fp = fopen("src.txt","rb")))
	{
		printf("目标源文件不存在!\n");
		exit(0);
	}
	//操作文件
	OpFile(fp);
}

int main(void)
{
	ReadFile();

	return 0;
}

时间: 2024-10-19 10:32:33

编译原理词法分析之关键词统计的相关文章

编译原理词法分析

#include<iostream>#include<String>#include <strstream>using namespace std; #define N 200;/*关键字结构体定义*/typedef struct keyword{ char name[20];}KeyWord;/*符号表结构体定义*/typedef struct symboltable{ char name[20]; //token值 string attribute; //属性值}S

编译原理 词法分析

原文地址:编译原理 词法分析 编译原理 词法分析 词法分析的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析. 1.正则表达式 对给定的字符集∑={c1,c2,...,cn},归纳定义: 1.空串ε是正则表达式 2.对于任意c∈∑,c是正则表达式 3.如果M和N是正则表达式,则下列表达式也是正则表达式 (1)选择 M|N={M,N} (2)连接 MN={mn|m∈M,n∈N} (3)闭包 M*={ε,M,MM,MMM,...} 2.正则表达式的扩展 (1)[c1-c

编译原理词法分析程序

预头文件 /*----Head file for analysis programs in....----*/ #include <stdio.h> #include <string.h> #include <ctype.h>                  //使用到的字符分类函数定义在的头文件 /** *TEST编译器:词法分析头文件 *@author mohui *@date 2015/04/12 ***/ //--------预定义常量-------- #de

编译原理--词法分析--实验报告(此文章在管理-发表文章 里也有)

实验一.词法分析实验 专业:信息技术与工程学院   姓名:吕军  学号:201506110159    一.        实验目的   目的:主要是为了编辑一个词法分析程序.了解计算机的识别源程序字符串的过程. 二.        实验内容和要求   实验内容:通过了解 各种单词符号对应的种别码表,编写一个简单的词法分析程序,通过计算机识别字符串,反映其中的单词符号和所对应的种别码. 实验要求:用户输入源程序字符串,输出:二元组(种别,单词本身) 三.        实验方法.步骤及结果测试

读龙书学编译原理 词法分析(2)...

第二种词法分析的方式当然是词法分析器的自动生成器. 如lex, jlex 等等. 那么如何来让生成器知道我们想要生成的Token呢 ? 这就涉及到统一的声明式规范的问题, 换句话讲, 你将按照生成器的形式要求将声明式的规范交给生成器, 那么它就能够对其进行识别. 所以我们只需要完成声明式的规范即可完成词法分析部分, 到最后词法解析器自动生成器就能为我们生成对应的自动机... 那么如何来给生成器一个统一的声明式的规范呢 ? 先要了解的一个数学工具就是正则表达式, 如图所示, 这是对正则表达式的基本

0920编译原理词法分析

#include<stdio.h> #include<stdlib.h> #include<string.h> #define _KEY_WOED_END "waiting for your expanding" //关键字结束标志 typedef struct { int typenum; char * word; }WORD; char input[255]; //输入换缓冲区 char token[255]=""; //单词

编译原理词法分析 java简单实现

package com.csray; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class LexicalAnalysis { static String id; public static void main(String[] args

0916编译原理词法分析作业二

#include<stdio.h>#include<stdlib.h>#include<string.h>#define _KEY_WOED_END "waiting for your expanding" //关键字结束标志 typedef struct{ int typenum; char * word;}WORD; char input[255]; //输入换缓冲区 char token[255]=""; //单词缓冲区 i

Atitit.编译原理与概论

编译原理 词法分析 Ast构建,语法分析 语意分析 6 数据结构  1. ? 记号 2. ? 语法树 3. ? 符号表 4. ? 常数表 5. ? 中间代码 1. ? 临时文件 7 其他问题  2. ? 分析和综合 3. ? 前端和后端 4. ? 遍 5. ? 语言定义和编译器 1.3 程序设计语言的发展历程1.3.1 走向高级程序设计语言1.3.2 对编译器的影响1.3.3 1.3节的练习1.4 构建一个编译器的相关科学1.4.1 编译器设计和实现中的建模1.4.2 代码优化的科学1.5 编译