编译原理词法分析程序c语言实现,编译原理词法分析实验C语言实现..doc

编译原理词法分析实验C语言实现.

编译原理词法分析器实验报告

2009~2010学年 第二学期 2007级 软件工程专业

班级 学号 姓名:应慧杰

实验目的:

结合课堂上学习的理论知识,通过C++实现词法分析器,更加深入的掌握词法分析;同时也可以更加了解词法分析的原理。

实验过程:

1、主程序分析:

程序一开始要求读入一个文本文件,然后判定该文本文件是否成功打开和读入,然后进行词法分析;

2、词法分析过程:

根据输入单词的第一个有效字符(有时还需读第二个字符),判断单词类,产生类号。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,比较之后输出结果。

3、实验过程中的问题:

一开始实验很生疏,很难把理论知识融汇到编程上,后来通过多次看PPT和书本内容,渐渐把握到诀窍;

不明确输入输出;这个也是通过PPT解决;

和以前编其他东西很不一样,一开始不知道如何下手;通过网上的成熟代码学习了下。

4、实验代码:

#include

#include

#include

#include

#include

#include

#define NULL 0

FILE *fp;

char ch;

char *keyword[34]={"auto","break","case","char","const","continue","default","do","double",

"else","enum","extern","float","for","goto","if","int","long","register",

"return","short","signed","sizeof","static","struct","switch","typedef", "printf",

"union","unsigned","void","volatile","while","main"};

char *operatornum[6]={"+","-","*","/","++","--"};

char *comparison[8]={"",">=","<>","==","!="};

char *interpunction[8]={",",";",":=",".","(",")","{","}"};

char *biaoshifu[6]={"%","$","^","&","_","#"};//特殊标识符

char *zhushifu[3]={"//","/*","*/"};//注释符

char *luoji[3]={"&&","||","!"};//逻辑运算符

//

bool search(char searchstr[],int wordtype)

{

int i;

switch (wordtype)

{

case 1:for(i=0;i<=33;i++)

{

if(strcmp(keyword[i],searchstr)==0)

return(true);

}

case 2:{

for(i=0;i<=5;i++)

{

if(strcmp(operatornum[i],searchstr)==0)

return(true);

}

break;

}

case 3: {

for(i=0;i<=7;i++)

{

if(strcmp(comparison[i],searchstr)==0)

return(true);

}

break;

}

case 4: for(i=0;i<=7;i++)

{

if(strcmp(interpunction[i],searchstr)==0)

return(true);

}

break;

case 5: for(i=0;i<=5;i++)

{

if(strcmp(biaoshifu[i],searchstr)==0)

return(true);

}break;

case 6: for(i=0;i<=2;i++)

{

if(strcmp(zhushifu[i],searchstr)==0)

词法分析是编译器的第一个阶段,也称为扫描器。该阶段的任务是将源程序中的字符流转换为记号流,即将字符序列分解为有意义的单元,并生成相应的记号。 下面是一个简单的词法分析器的示例,可以用来识别C语言中的关键字和标识符。 ```c #include <stdio.h> #include <ctype.h> #include <string.h> int main() { char input[100]; printf("Enter C program:\n"); fgets(input, 100, stdin); // 读入一行输入 char *keywords[32] = {"auto", "break", "case", "char", "const", "continue", "default", "do", "double", "else", "enum", "extern", "float", "for", "goto", "if", "int", "long", "register", "return", "short", "signed", "sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", "void", "volatile", "while"}; int num_keywords = 32; char identifier[100]; int index = 0; for (int i = 0; i < strlen(input); i++) { // 跳过空格、制表符和换行符 if (isspace(input[i])) continue; // 如果是字母,可能是关键字或标识符 if (isalpha(input[i])) { identifier[index++] = input[i]; while (isalnum(input[++i])) identifier[index++] = input[i]; identifier[index] = '\0'; // 对比关键字 for (int j = 0; j < num_keywords; j++) { if (strcmp(identifier, keywords[j]) == 0) { printf("%s is a keyword\n", identifier); break; } } // 如果不是关键字,就是标识符 if (!isalpha(input[i])) { printf("%s is an identifier\n", identifier); index = 0; } i--; } } return 0; } ``` 该程序通过读取一行输入,逐个字符进行词法分析。它首先定义了所有C语言关键字的字符串数组,然后逐个读入字符并进行处理。如果读入的是空格、制表符或换行符,则跳过。如果读入的是字母,则可能是关键字或标识符,程序会一直读入字母和数字,直到遇到一个非字母非数字的字符。然后对比关键字数组,如果匹配上了,就输出该关键字;否则,就输出标识符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值