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]="";   //单词缓冲区

int p_input;        //输入换缓冲区指针

int p_token;        //单词缓冲区指针

char ch;           //当前所读的字符

char *rwtab[]={"begin","if","then","while","do","end",_KEY_WOED_END};        //C语言关键字

WORD * scaner();    //词法扫描函数,获得关键字

main()
{
	int over=1;
	WORD *oneword;
	oneword=(WORD *)malloc(sizeof(WORD));
	printf("请输入您的字符串(以#作为结束标志):");
	scanf("%[^#]s",input);                        //读入源程序字符串到缓冲区,以#结束,允许多行输入
	p_input=0;
	printf("您输入的字符串是:%s\n\n",input);
	while(over<1000&&over!=-1)
	{
		oneword=scaner();
		printf("(%d,%s)\n",oneword->typenum,oneword->word);
		over=oneword->typenum;
	}
	printf("\n\n备注:数字10代表所输入的不是关键词,只是普通词\n");
	printf("     数字20代表您输入的是数字\n");
    printf("     数字1000是结束标志\n\n");

}

//需要用到的自编函数参考实现
//从输入缓冲区读取一个字符到ch中

char m_getch(){
	ch=input[p_input];
	p_input=p_input+1;
	return (ch);
}

//去掉空白字符
void getbc()
{
	while(ch==‘ ‘||ch==10){
	ch=input[p_input];
	p_input=p_input+1;
	}
}

//拼接单词
void concat()
{
	token[p_token]=ch;
	p_token=p_token+1;
	token[p_token]=‘\0‘;
}

//判断是否字母
int letter()
{
	if(ch>=‘a‘&&ch<=‘z‘||ch>=‘A‘&&ch<=‘Z‘)return 1;
	else return 0;
}

//判断是否数字
int digit()
{
	if(ch>=‘0‘&&ch<=‘9‘)
		return 1;
	else
		return 0;
}

//检索关键字表格
int reserve()
{
	int i=0;
	for(i=0;i<7;i++)
	{
		if(!strcmp(rwtab[i],token))
		{
			return i+1;
		}
		i=i+1;
	}
	return 10;
}

//回退一个字符
void retract()
{
	p_input=p_input-1;
}

WORD *scaner()
{
	WORD *myword;
	myword=(WORD *)malloc(sizeof(WORD));
	myword->typenum=10;
	myword->word="";
	p_token=0;
	m_getch();
	getbc();
	if(letter())
	{
		while(letter()||digit())
		{
		   concat();
		   m_getch();

		}
		retract();
 	    myword->typenum=reserve();
	    myword->word=token;
	    return(myword);
	}
	else if(digit())
	{
		while(digit())
		{
			concat();
			m_getch();
		}
		retract();
		myword->typenum=20;
	    myword->word=token;
		return(myword);
	}
	else
	{
		switch(ch)
		{
		case ‘=‘:m_getch();
			if(ch==‘=‘)
			{
				myword->typenum=39;
	            myword->word="==";
		        return(myword);
			}
			retract();
			myword->typenum=21;
	        myword->word="=";
		    return(myword);
			break;
		case ‘+‘:
			myword->typenum=22;
	            myword->word="+";
		        return(myword);
				break;
		case ‘-‘:
			myword->typenum=23;
	            myword->word="-";
		        return(myword);
				break;
		case ‘*‘:
			myword->typenum=24;
	        myword->word="*";
		    return(myword);
		    break;
		case ‘/‘:
			myword->typenum=25;
	        myword->word="/";
		    return(myword);
		    break;
		case ‘(‘:
			myword->typenum=26;
	        myword->word="(";
		    return(myword);
		    break;
		case ‘)‘:
			myword->typenum=27;
	        myword->word=")";
		    return(myword);
		    break;
		case ‘[‘:
			myword->typenum=28;
	        myword->word="[";
		    return(myword);
		    break;
		case ‘]‘:
			myword->typenum=29;
	        myword->word="]";
		    return(myword);
		    break;
		case ‘{‘:
			myword->typenum=30;
	        myword->word="{";
		    return(myword);
		    break;
		case ‘}‘:
			myword->typenum=31;
	        myword->word="}";
		    return(myword);
		    break;
		case ‘,‘:
			myword->typenum=32;
	        myword->word=",";
		    return(myword);
		    break;
		case ‘:‘:
			myword->typenum=33;
	        myword->word=":";
		    return(myword);
		    break;
		case ‘;‘:
			myword->typenum=34;
	        myword->word=";";
		    return(myword);
		    break;
		case ‘>‘:
			myword->typenum=35;
	        myword->word=">";
		    return(myword);
		    break;
		case ‘<‘:
			myword->typenum=36;
	        myword->word="<";
		    return(myword);
		    break;
		case ‘!‘:
			m_getch();
			if(ch==‘=‘)
			{
				myword->typenum=40;
				myword->word="!=";
				return(myword);
			}
			retract();
			myword->typenum=-1;
	        myword->word="ERROR";
		    return(myword);
		    break;
		case ‘\0‘:
			myword->typenum=1000;
	        myword->word="OVER";
		    return(myword);
		    break;
		default:
			myword->typenum=-1;
	        myword->word="ERROR";
		    return(myword);
			}
		}
	}

  

时间: 2024-07-28 15:06:18

0920编译原理词法分析的相关文章

编译原理词法分析

#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呢 ? 这就涉及到统一的声明式规范的问题, 换句话讲, 你将按照生成器的形式要求将声明式的规范交给生成器, 那么它就能够对其进行识别. 所以我们只需要完成声明式的规范即可完成词法分析部分, 到最后词法解析器自动生成器就能为我们生成对应的自动机... 那么如何来给生成器一个统一的声明式的规范呢 ? 先要了解的一个数学工具就是正则表达式, 如图所示, 这是对正则表达式的基本

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

1.本文中,需要将系统关键词自己首先定义在KeyWord数组中(如18行),这样程序才会自动进行比较: 2.选出某个关键词后,将其code置为0(如26行),避免多次打印该关键词: 3.请自己创建src.txt文件(如65行),并在里面放入一段"你需要统计的语言"代码. //@Title:词法分析之关键词统计 //@Author:qingdujun //@FileName:Main.CPP #include <stdio.h> #include <stdlib.h&g

编译原理词法分析 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 编译