c语言链表单值化,《编译原理及实践教程》第3章词法分析.ppt
时间: 2023-11-22 08:53:54 浏览: 88
链表单值化是指将词法分析器从输入流中读取的字符序列转换为一个个单词,并将这些单词按照顺序存储在链表中。具体实现过程如下:
1. 定义一个结构体来表示单词,包括单词的类型和值等信息。
2. 读取输入流中的字符序列,并识别出各个单词的类型和值。
3. 将每个单词保存在一个结构体中,并将这些结构体按照顺序链接在一起,形成一个链表。
4. 返回链表的头指针,供后续的语法分析器使用。
下面是一个简单的C语言链表单值化的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 100
//定义单词的类型
enum TokenType {
RESERVED_WORD,
IDENTIFIER,
NUMBER,
SYMBOL
};
//定义单词的结构体
struct Token {
enum TokenType type;
char value[MAX_LEN];
struct Token *next;
};
//读取输入流中的字符序列,并识别出各个单词的类型和值
struct Token *lex_analyze(char *input) {
struct Token *head = NULL; //链表头指针
struct Token *tail = NULL; //链表尾指针
int len = strlen(input);
int i = 0;
while (i < len) {
//识别保留字
if (strncmp(input + i, "if", 2) == 0 ||
strncmp(input + i, "else", 4) == 0 ||
strncmp(input + i, "while", 5) == 0 ||
strncmp(input + i, "do", 2) == 0) {
struct Token *token = (struct Token *) malloc(sizeof(struct Token));
token->type = RESERVED_WORD;
strncpy(token->value, input + i, strlen("if"));
token->next = NULL;
if (head == NULL) {
head = tail = token;
} else {
tail->next = token;
tail = token;
}
i += strlen("if");
}
//识别标识符
else if (input[i] >= 'a' && input[i] <= 'z') {
struct Token *token = (struct Token *) malloc(sizeof(struct Token));
token->type = IDENTIFIER;
int j = i;
while (input[j] >= 'a' && input[j] <= 'z') {
j++;
}
strncpy(token->value, input + i, j - i);
token->next = NULL;
if (head == NULL) {
head = tail = token;
} else {
tail->next = token;
tail = token;
}
i = j;
}
//识别数字
else if (input[i] >= '0' && input[i] <= '9') {
struct Token *token = (struct Token *) malloc(sizeof(struct Token));
token->type = NUMBER;
int j = i;
while (input[j] >= '0' && input[j] <= '9') {
j++;
}
strncpy(token->value, input + i, j - i);
token->next = NULL;
if (head == NULL) {
head = tail = token;
} else {
tail->next = token;
tail = token;
}
i = j;
}
//识别符号
else {
struct Token *token = (struct Token *) malloc(sizeof(struct Token));
token->type = SYMBOL;
strncpy(token->value, input + i, 1);
token->next = NULL;
if (head == NULL) {
head = tail = token;
} else {
tail->next = token;
tail = token;
}
i++;
}
}
return head;
}
//打印单词链表
void print_tokens(struct Token *head) {
while (head != NULL) {
printf("(%d, %s) ", head->type, head->value);
head = head->next;
}
}
int main() {
char input[MAX_LEN] = "if (a > b) { c = a - b; } else { c = b - a; }";
struct Token *head = lex_analyze(input); //进行链表单值化
print_tokens(head); //打印单词链表
return 0;
}
```
该示例代码实现了一个简单的C语言词法分析器,可以将输入的C语言代码转换为一个个单词,并按照顺序存储在一个链表中。
阅读全文