`

C编写的词法分析器

阅读更多
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
int i,j,k,flag,number,status;
/*status which is use to judge the string is keywords or not!*/
char ch;
char words[10] = {" "};
char program[500];
int Scan(char program[])
{
	char *keywords[13] = {"void","main","if","then","break","int",
	"char","float","include","for","while","printf",
	"scanf"};
	number = 0;
	status   = 0;
	j      = 0;
	ch     = program[i++];
       /* To handle the lettle space ands tab*/

      /*handle letters*/
	if ((ch >= 'a') && (ch <= 'z' ))
	{
		while ((ch >= 'a') && (ch <= 'z' ))
		{
			words[j++]=ch;
			ch=program[i++];
		}
		i--;
		words[j++] = '\0';
		for (k = 0; k < 13; k++)
		{
			if (strcmp (words,keywords[k]) == 0)
			{
				switch(k)
				{
					case 0:{
					 flag = 1;
					 status = 1;
					 break;
					}
					case 1:{
					 flag = 2;
					 status = 1;
					 break;
					}
					case 2:{
					 flag = 3;
					 status = 1;
					 break;
					}
					case 3:{
					 flag = 4;
					 status = 1;
					 break;
					}
					case 4:{
					 flag = 5;
					 status = 1;
					 break;
					}
					case 5:{
					 flag = 6;
					 status = 1;
					 break;
						   }
					case 6:{
					 flag = 7;
					 status = 1;
					 break;
						   }
					case 7:{
					 flag = 8;
					 status = 1;
					 break;
						   }
					case 8:{
					 flag = 9;
					 status = 1;
					 break;
						   }
					case 9:{
					 flag = 10;
					 status = 1;
					 break;
						   }
					case 10:{
					 flag = 11;
					 status = 1;
					 break;
					}
					case 11:{
					 flag = 12;
					 status = 1;
					 break;
					}
					case 12:{
					 flag = 13;
					 status = 1;
					 break;
					}
				}
			}
		}
	   if (status == 0)
	   {
		  flag = 100;
	   }
	}
	/*handle digits*/
	else if ((ch >= '0') && (ch <= '9'))
	{
		number = 0;
		while ((ch >= '0' ) && (ch <= '9' ))
		{
			number = number*10+(ch-'0');
			ch     = program[i++];
		}
		flag = 200;
		i--;
	}
	/*opereation and edge handle*/
	else switch (ch)
	{
		case '=':{
			if (ch == '=')
			{
				words[j++] = ch;
				words[j]   = '\0';
				ch         = program[i++];
			}
			if (ch == '=')
			{
				words[j++] = ch;
				words[j]   = '\0';
				flag       = 401;
			}
			else
			{
				i--;
				flag       = 402;
			}
			break;
		}
		case'>':{
			if (ch == '>')
			{
				words[j++] = ch;
				words[j]   = '\0';
				ch         = program[i++];
			}
		   if (ch == '=')
		   {
			   words[j++] = ch;
			   words[j]   = '\0';
			   flag       = 403;
		   }
		   else
		   {
			   i--;
			   flag       = 404;
		   }
			break;
		}
		case'<':{
			if (ch == '<'){
				words[j++] = ch;
				words[j]   = '\0';
				ch         = program[i++];
			}
			if (ch == '=')
			{
				words[j++] = ch;
				words[j]   = '\0';
				flag       = 405;
			}
			else
			{
				i--;
				flag       = 406;
			}	
			break;
		}
		case'!':{
			if (ch == '!'){
				words[j++] = ch;
				words[j]   = '\0';
				ch         = program[i++];
			}
			if (ch == '=')
			{
				words[j++] = ch;
				words[j]   = '\0';
				flag       = 407;
			}
			else
			{
				i--;
				flag       = 408;
			}
			break;
		}
		case'+':{
			if (ch == '+'){
				words[j++] = ch;
				words[j]   = '\0';
				ch         = program[i++];
			}
			if (ch == '=')
			{
				words[j++] = ch;
				words[j]   = '\0';
				flag       = 409;
			}
			else if (ch == '+')
			{
				words[j++] = ch;
				words[j]   = '\0';
				flag       = 410;
			}
			else
			{
				i--;
				flag       = 411;
			}
		   break;
		}
		case'-':{
			if (ch == '-'){
			   words[j++] = ch;
			   words[j]   = '\0';
			   ch         = program[i++];
			}
			if (ch == '=')
			{
				words[j++] = ch;
				words[j]   = '\0';
				flag       = 412;
			}
			else if( ch == '-')
			{
				words[j++] = ch;
				words[j]   = '\0';
				flag       = 413;
			}
			else
			{
				i--;
				flag       = 414;
		   }
		   break;
		}
		case'*':{
			if (ch == '*'){
				words[j++] = ch;
				words[j]   = '\0';
				ch         = program[i++];
			}
			if (ch == '=')
			{
			   words[j++] = ch;
			   words[j]   = '\0';
			   flag       = 415;
			}
			else
			{
			   i--;
			   flag       = 416;
			}
			break;
		 }
		case'/':{
			if (ch == '/'){
			   words[j++] = ch;
			   words[j]   = '\0';
			   ch         = program[i++];
			}
			if (ch == '=')
			{
			   words[j++] = ch;
			   words[j]   = '\0';
			   flag       = 417;
			}
			else
			{
			   i--;
			   flag       = 418;
			}
			break;
		}
		case';':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 501;
		  break;
		 }
		case'(':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 502;
		  break;
		 }
		case')':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 503;
		  break;
		}
		case'[':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 504;
		  break;
		 }
		case']':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 505;
		  break;
		 }
		case'{':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 506;
		  break;
		 }
		case'}':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 507;
		  break;
		 }
		case':':{
		  words[j]   = ch;
		  words[j+1] = '\0';
		  flag       = 508;
		  break;
		}
		case'"':{
		  words[j] = ch;
		  words[j+1] = '\0';
		  flag = 509;
		  break;
		}
		case'%':{
		   if (ch == '%')
			   words[j++] = ch;
			   words[j]   = '\0';
			   ch         = program[i++];
			   if (ch == '=')
			   {
			   words[j++] = ch;
			   words[j]   = '\0';
			   flag       = 510;
			   }
			   else
			   {
			   i--;
			   flag       = 511;
			   }
			 break;
		}
		case',':{
		 words[j] = ch;
		 words[j+1] = '\0';
		 flag = 512;
		 break;
		}
		case'#':{
		 words[j] = ch;
		 words[j+1] = '\0';
		 flag = 513;
		 break;
		}
		case'@':{
		 words[j] = '#';
		 flag = 0;
		 break;
		}
		default:{
		 flag = -1;
		 break;
		}
	}
	return flag;
}
void main()
{
	i=0;
	printf("please input a program end with @");
	do
	{
	  ch           = getchar();
	  program[i++] = ch;
	}while(ch != '@');
	i = 0;
	do{
		flag = Scan(program);
		if (flag == 20)
		{
			printf("(%2d,%4d)",flag,number);
		}
		else if (flag == -1)
		{
			printf("(%d,error)",flag);
		}
		else
		{
			printf("(%2d,%4s)",flag,words);
		}
	}while (flag != 0);
    system("pause");
}

 

分享到:
评论

相关推荐

    C语言编写 词法分析器

    extern void out(int c,char* value) { printf("(%d,%s)\n",c,value); } extern void report_error(void) { printf("Error!!!!\n"); } void scanner_example(FILE *fp) { char ch; int i,c; ch=fgetc(fp); ...

    用C语言编写的词法分析程序词法分析器

    《编译原理》词法分析程序设计方案,用C语言编写的词法分析器!

    C语言编写词法分析器

    总之,使用C语言编写词法分析器涉及字符流处理、模式匹配、状态机设计以及标记的定义和存储。这是一项基础但重要的任务,是理解和构建编译器的关键步骤。通过实践,你可以加深对编译原理的理解,增强解决问题的能力...

    c语言编写的词法分析器

    词法分析器 编译原理实验 c语言版

    词法分析器C语言编写(附实验报告)

    在C语言中编写词法分析器,我们需要对C语言的语法特性有深入理解,例如知道哪些字符组合可以构成合法的标识符,哪些是关键字,哪些是运算符,以及如何处理数字、字符串等常量。此外,我们还需要了解正则表达式或者...

    c编写的词法分析器c 编写的 词法分析器

    编写词法分析器时,我们通常会使用状态机模型,它由一组状态和从一个状态转换到另一个状态的规则组成。例如,当我们遇到一个数字字符时,词法分析器可能会进入“读取数字”状态,直到遇到非数字字符为止。此外,为了...

    java编写 c语言词法分析器

    Java编写C语言词法分析器是一项在编程领域中常见的任务,它涉及到编译原理和语言处理技术。词法分析器,也称为扫描器或词法分析程序,是编译器或解释器的第一阶段,它的主要任务是将源代码分解成一系列有意义的标记...

    编译原理词法分析C语言实现实验报告(含源码)

    本实验报告将探讨如何使用C语言实现一个简单的词法分析器,该分析器针对的是C语言,并包含源码供学习参考。 一、问题描述 实验的目标是设计并实现一个词法分析器,用于识别C语言中的单词符号,如基本字、标识符、无...

    一个关于c语言的词法分析器

    C语言的词法分析器是编译器设计过程中的一个重要组成...通过学习这些材料,你可以了解词法分析的基本概念,掌握编写词法分析器的方法,并能够实际操作和测试自己的实现。这将有助于提升你在编译技术领域的专业技能。

    词法分析器 c语言编写

    在C语言中编写词法分析器,需要深入理解C语言特性和编译原理的基本概念。 在词法分析阶段,主要涉及以下知识点: 1. **正则表达式**:词法分析器通常使用正则表达式来定义不同类型的标记模式。正则表达式是一种...

    java实现C语言的词法分析器

    6. **输入输出处理**:词法分析器需要读取C源代码文件,并输出Token序列。Java提供了标准的IO库,如`BufferedReader`和`PrintWriter`,可以用来读取源文件和打印Token序列。 7. **错误处理**:在词法分析过程中,...

    java词法分析器(C语言)

    使用C语言编写词法分析器,需要对C语言的基本语法和数据结构有深入了解。常见的实现方式是使用状态机,通过数组或链表存储状态转换,并使用缓冲区处理输入字符。C语言的高效性和灵活性使得它成为实现词法分析器的...

    一个简易的c语言词法分析器

    在C语言环境中,词法分析器通常用于识别关键字、标识符、常量、运算符、分隔符等元素。下面我们将深入探讨这个简易的C语言词法分析器。 首先,词法分析器的输入是源代码文件,由ASCII字符组成。它的主要任务是识别...

    C语言编写的词法分析器

    这个压缩包提供的内容是一个C语言编写的词法分析器源码,对于学习编译原理和实践编程语言处理技术的人来说,是非常有价值的资源。 首先,词法分析器的主要任务是对源代码进行扫描,识别出关键字、标识符、常量、...

    C语言的词法分析器 另一版本

    掌握词法分析器的编写技巧,不仅可以提升对编程语言底层机制的理解,还能为自定义编程环境或工具的开发打下坚实基础。 总之,"C语言的词法分析器 另一版本"是一个深入学习编译原理和技术的好项目,它涉及到的关键...

    简易C语言词法分析器

    本项目名为“简易C语言词法分析器”,它是由C语言编写的,用于处理C语言源代码的词法分析任务。 词法分析器,又称为扫描器或词法分析器,其主要任务是识别源代码中的关键字、标识符、常量、运算符以及分隔符等元素...

    c语言实现词法分析器

    本文将深入探讨如何使用C语言来实现一个词法分析器,并结合压缩包中的资源进行说明。 首先,词法分析器,也称为扫描器或lexer,它的主要任务是读取源代码,根据预定义的规则(通常存储在正则表达式中)识别出关键字...

    编译原理实验一——C 语言词法分析器设计与实现

    实验中使用C语言编写词法分析器,可能涉及到的库函数如`&lt;stdio.h&gt;`、`&lt;conio.h&gt;`、`&lt;math.h&gt;`、`&lt;string.h&gt;`和`&lt;stdlib.h&gt;`。在C语言环境中,如code::Blocks,可以调试和运行这个分析器。 通过这个实验,学生不仅...

    用C语言实现词法分析程序

    为了测试和验证词法分析器的正确性,通常会编写一套测试用例,包括各种保留字、标识符、数字、运算符、注释和空白字符的组合,确保程序在各种情况下都能正确工作。 193这个文件名可能是源代码文件的编号或者是词法...

    c - minus手工构造词法分析器

    在这个项目中,我们专注于手工构造一个C- Minus的词法分析器。词法分析器,也称为扫描器,是编译器的第一阶段,它将源代码分解成一个个有意义的符号,这些符号被称为“标记”(tokens),为后续的语法分析和语义分析...

Global site tag (gtag.js) - Google Analytics