#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");
}
分享到:
相关推荐
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语言的语法特性有深入理解,例如知道哪些字符组合可以构成合法的标识符,哪些是关键字,哪些是运算符,以及如何处理数字、字符串等常量。此外,我们还需要了解正则表达式或者...
编写词法分析器时,我们通常会使用状态机模型,它由一组状态和从一个状态转换到另一个状态的规则组成。例如,当我们遇到一个数字字符时,词法分析器可能会进入“读取数字”状态,直到遇到非数字字符为止。此外,为了...
Java编写C语言词法分析器是一项在编程领域中常见的任务,它涉及到编译原理和语言处理技术。词法分析器,也称为扫描器或词法分析程序,是编译器或解释器的第一阶段,它的主要任务是将源代码分解成一系列有意义的标记...
本实验报告将探讨如何使用C语言实现一个简单的词法分析器,该分析器针对的是C语言,并包含源码供学习参考。 一、问题描述 实验的目标是设计并实现一个词法分析器,用于识别C语言中的单词符号,如基本字、标识符、无...
C语言的词法分析器是编译器设计过程中的一个重要组成...通过学习这些材料,你可以了解词法分析的基本概念,掌握编写词法分析器的方法,并能够实际操作和测试自己的实现。这将有助于提升你在编译技术领域的专业技能。
在C语言中编写词法分析器,需要深入理解C语言特性和编译原理的基本概念。 在词法分析阶段,主要涉及以下知识点: 1. **正则表达式**:词法分析器通常使用正则表达式来定义不同类型的标记模式。正则表达式是一种...
6. **输入输出处理**:词法分析器需要读取C源代码文件,并输出Token序列。Java提供了标准的IO库,如`BufferedReader`和`PrintWriter`,可以用来读取源文件和打印Token序列。 7. **错误处理**:在词法分析过程中,...
使用C语言编写词法分析器,需要对C语言的基本语法和数据结构有深入了解。常见的实现方式是使用状态机,通过数组或链表存储状态转换,并使用缓冲区处理输入字符。C语言的高效性和灵活性使得它成为实现词法分析器的...
在C语言环境中,词法分析器通常用于识别关键字、标识符、常量、运算符、分隔符等元素。下面我们将深入探讨这个简易的C语言词法分析器。 首先,词法分析器的输入是源代码文件,由ASCII字符组成。它的主要任务是识别...
这个压缩包提供的内容是一个C语言编写的词法分析器源码,对于学习编译原理和实践编程语言处理技术的人来说,是非常有价值的资源。 首先,词法分析器的主要任务是对源代码进行扫描,识别出关键字、标识符、常量、...
掌握词法分析器的编写技巧,不仅可以提升对编程语言底层机制的理解,还能为自定义编程环境或工具的开发打下坚实基础。 总之,"C语言的词法分析器 另一版本"是一个深入学习编译原理和技术的好项目,它涉及到的关键...
本项目名为“简易C语言词法分析器”,它是由C语言编写的,用于处理C语言源代码的词法分析任务。 词法分析器,又称为扫描器或词法分析器,其主要任务是识别源代码中的关键字、标识符、常量、运算符以及分隔符等元素...
本文将深入探讨如何使用C语言来实现一个词法分析器,并结合压缩包中的资源进行说明。 首先,词法分析器,也称为扫描器或lexer,它的主要任务是读取源代码,根据预定义的规则(通常存储在正则表达式中)识别出关键字...
实验中使用C语言编写词法分析器,可能涉及到的库函数如`<stdio.h>`、`<conio.h>`、`<math.h>`、`<string.h>`和`<stdlib.h>`。在C语言环境中,如code::Blocks,可以调试和运行这个分析器。 通过这个实验,学生不仅...
为了测试和验证词法分析器的正确性,通常会编写一套测试用例,包括各种保留字、标识符、数字、运算符、注释和空白字符的组合,确保程序在各种情况下都能正确工作。 193这个文件名可能是源代码文件的编号或者是词法...
在这个项目中,我们专注于手工构造一个C- Minus的词法分析器。词法分析器,也称为扫描器,是编译器的第一阶段,它将源代码分解成一个个有意义的符号,这些符号被称为“标记”(tokens),为后续的语法分析和语义分析...