自己编程实现对C语言的词法分析程序,加深对词法分析原理的理解。 二、 实验要求 1、 C语言分为关键字、标识符、数字、运算符、界符五类。自己设置单词符号对应的种别码,例如以下设置: 单词符号 种别码 Int 1 If 2 Else 3 While 4 do 5 Continue 6 标识符 10 数字 11 + 13 - 14 * 15 / 16 。。。。。。 。。。。。。 2、要求能够识别以下代码: int main() { char c=56; int a=1; int bb_b1=7; if(a>bb_b1)c=9; else c=90; while(1){;} return 67; }的实验代码,并且如何使用Devc++进行编译
时间: 2023-12-10 08:41:07 浏览: 91
以下是一个简单的C语言词法分析程序,可以识别上述要求的代码,并输出每个单词的种别码和属性值:
```c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX_LEN 100
// 定义单词符号对应的种别码
#define KW_INT 1
#define KW_IF 2
#define KW_ELSE 3
#define KW_WHILE 4
#define KW_DO 5
#define KW_CONTINUE 6
#define IDENTIFIER 10
#define NUMBER 11
#define ADD 13
#define SUB 14
#define MUL 15
#define DIV 16
#define SEMICOLON 17
#define LEFT_BRACKET 18
#define RIGHT_BRACKET 19
#define LEFT_BRACE 20
#define RIGHT_BRACE 21
#define GREATER_THAN 22
#define LESS_THAN 23
#define EQUAL 24
// 定义词法分析函数
void lexicalAnalysis(char *code);
int main() {
char code[MAX_LEN] = "int main() { char c=56; int a=1; int bb_b1=7; if(a>bb_b1)c=9; else c=90; while(1){;} return 67; }";
lexicalAnalysis(code);
return 0;
}
void lexicalAnalysis(char *code) {
int i = 0;
int len = strlen(code);
while (i < len) {
// 跳过空格和换行符
while (isspace(code[i])) {
i++;
}
// 判断关键字
if (strncmp(code + i, "int", 3) == 0) {
printf("%d\t%s\n", KW_INT, "int");
i += 3;
} else if (strncmp(code + i, "if", 2) == 0) {
printf("%d\t%s\n", KW_IF, "if");
i += 2;
} else if (strncmp(code + i, "else", 4) == 0) {
printf("%d\t%s\n", KW_ELSE, "else");
i += 4;
} else if (strncmp(code + i, "while", 5) == 0) {
printf("%d\t%s\n", KW_WHILE, "while");
i += 5;
} else if (strncmp(code + i, "do", 2) == 0) {
printf("%d\t%s\n", KW_DO, "do");
i += 2;
} else if (strncmp(code + i, "continue", 8) == 0) {
printf("%d\t%s\n", KW_CONTINUE, "continue");
i += 8;
}
// 判断标识符
else if (isalpha(code[i])) {
int j = i;
while (isalnum(code[j])) {
j++;
}
printf("%d\t%.*s\n", IDENTIFIER, j - i, code + i);
i = j;
}
// 判断数字
else if (isdigit(code[i])) {
int j = i;
while (isdigit(code[j])) {
j++;
}
printf("%d\t%.*s\n", NUMBER, j - i, code + i);
i = j;
}
// 判断运算符和界符
else if (code[i] == '+') {
printf("%d\t%c\n", ADD, code[i]);
i++;
} else if (code[i] == '-') {
printf("%d\t%c\n", SUB, code[i]);
i++;
} else if (code[i] == '*') {
printf("%d\t%c\n", MUL, code[i]);
i++;
} else if (code[i] == '/') {
printf("%d\t%c\n", DIV, code[i]);
i++;
} else if (code[i] == ';') {
printf("%d\t%c\n", SEMICOLON, code[i]);
i++;
} else if (code[i] == '(') {
printf("%d\t%c\n", LEFT_BRACKET, code[i]);
i++;
} else if (code[i] == ')') {
printf("%d\t%c\n", RIGHT_BRACKET, code[i]);
i++;
} else if (code[i] == '{') {
printf("%d\t%c\n", LEFT_BRACE, code[i]);
i++;
} else if (code[i] == '}') {
printf("%d\t%c\n", RIGHT_BRACE, code[i]);
i++;
} else if (code[i] == '>') {
printf("%d\t%c\n", GREATER_THAN, code[i]);
i++;
} else if (code[i] == '<') {
printf("%d\t%c\n", LESS_THAN, code[i]);
i++;
} else if (code[i] == '=') {
if (code[i+1] == '=') {
printf("%d\t%s\n", EQUAL, "==");
i += 2;
} else {
printf("%d\t%c\n", EQUAL, code[i]);
i++;
}
}
// 其他情况
else {
printf("Unknown token %c\n", code[i]);
i++;
}
}
}
```
使用Dev-C++进行编译的步骤如下:
1. 打开Dev-C++,点击菜单栏的“文件”-“新建”-“源文件”;
2. 将上述代码复制到新建的源文件中;
3. 点击菜单栏的“运行”-“编译”;
4. 如果编译成功,会在输出窗口中显示“编译成功”;
5. 点击菜单栏的“运行”-“运行”,可在控制台中查看程序输出结果。
阅读全文