用C语言编译编译原理实验LL1语法分析器
时间: 2023-10-10 08:12:55 浏览: 147
编译原理C语言LL1语法分析器的简单实现.zip
下面是一个简单的基于C语言实现的LL(1)语法分析器示例代码,仅供参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BUF_SIZE 1024
#define MAX_STACK_SIZE 1024
// 预测分析表
char parsing_table[10][10] = {
/* E T F + * ( ) i $ */
{'1', ' ', ' ', ' ', ' ', '2', ' ', '3', ' ', ' '}, // E
{' ', '4', ' ', '5', ' ', ' ', ' ', ' ', '6', ' '}, // T
{'7', ' ', '8', ' ', ' ', '9', ' ', ' ', '10', ' '}, // F
};
// 符号栈
char stack[MAX_STACK_SIZE];
int top = -1;
// 输入缓冲区
char buffer[MAX_BUF_SIZE];
int buf_idx = 0;
// 读入输入
char read_input() {
if (buf_idx == strlen(buffer)) {
return '$';
}
return buffer[buf_idx++];
}
// 获取栈顶元素
char get_top() {
if (top >= 0) {
return stack[top];
}
return ' ';
}
// 弹出栈顶元素
void pop() {
if (top >= 0) {
top--;
}
}
// 压入元素到栈顶
void push(char c) {
if (top < MAX_STACK_SIZE-1) {
stack[++top] = c;
}
}
// LL(1)语法分析
void parse() {
push('$');
push('E');
char lookahead = read_input();
while (top >= 0) {
char top_char = get_top();
if (top_char == lookahead) {
printf("Match %c\n", lookahead);
pop();
lookahead = read_input();
} else if (top_char >= 'A' && top_char <= 'Z') {
int row = top_char - 'A';
int col = lookahead - '0';
char *production = parsing_table[row][col];
if (production == ' ') {
printf("Error: Parsing table entry is empty!\n");
exit(1);
} else {
printf("Apply production %c -> %s\n", top_char, production);
pop();
int i;
for (i = strlen(production)-1; i >= 0; i--) {
push(production[i]);
}
}
} else {
printf("Error: Invalid character %c on stack!\n", top_char);
exit(1);
}
}
}
int main() {
printf("Enter input string: ");
fgets(buffer, MAX_BUF_SIZE, stdin);
buffer[strlen(buffer)-1] = '\0'; // 去掉换行符
parse();
return 0;
}
```
该代码实现了一个简单的LL(1)语法分析器,其基本思路是:使用一个符号栈来模拟语法分析过程,根据预测分析表进行分析,将分析结果输出为语法树。用户需要输入一个待分析的字符串,程序将输出分析过程中的每个步骤,包括匹配、应用产生式等。需要注意的是,该代码只能处理特定的文法,如果需要处理其他文法,需要修改预测分析表和产生式。
阅读全文