对文法 D→TL T→i T→f L→L,x L→x 写c语言代码,可以输出文法、分析表和分析过程
时间: 2023-10-25 16:18:35 浏览: 55
以下是文法 D→TL T→i T→f L→L,x L→x 的 C 语言代码实现,包括输出文法、分析表和分析过程的功能。
```
#include <stdio.h>
#include <string.h>
// 定义文法符号和产生式
#define D 0
#define T 1
#define L 2
#define i 3
#define f 4
#define x 5
char *symbols[] = {"D", "T", "L", "i", "f", "x"};
char *productions[] = {"D->TL", "T->i", "T->f", "L->L,x", "L->x"};
// 定义分析表
int action_table[][6] = {
{0, 0, 0, 1, 2, 0},
{3, 0, 0, 0, 0, 0},
{0, 4, 5, 0, 0, 6},
};
int goto_table[][3] = {
{1, 2, 0},
{0, 0, 0},
{0, 0, 0},
};
// 定义分析栈
#define STACK_SIZE 100
int stack[STACK_SIZE];
int top = -1;
// 获取符号对应的编号
int get_symbol_index(char *symbol) {
for (int i = 0; i < 6; i++) {
if (strcmp(symbol, symbols[i]) == 0) {
return i;
}
}
return -1;
}
// 打印分析栈
void print_stack() {
printf("stack: ");
for (int i = 0; i <= top; i++) {
printf("%d ", stack[i]);
}
printf("\n");
}
// 将符号入栈
void push(int symbol_index) {
if (top == STACK_SIZE - 1) {
printf("stack overflow\n");
return;
}
stack[++top] = symbol_index;
print_stack();
}
// 弹出栈顶的符号
int pop() {
if (top == -1) {
printf("stack underflow\n");
return -1;
}
int symbol_index = stack[top--];
print_stack();
return symbol_index;
}
// 获取栈顶的符号
int get_top() {
if (top == -1) {
printf("stack underflow\n");
return -1;
}
return stack[top];
}
// 进行语法分析
void syntax_analysis(char *input) {
int input_len = strlen(input);
int i = 0;
while (i < input_len) {
// 获取当前输入符号的编号
char input_symbol[2] = {input[i], '\0'};
int input_symbol_index = get_symbol_index(input_symbol);
if (input_symbol_index == -1) {
printf("invalid input symbol: %s\n", input_symbol);
return;
}
printf("input: %c\n", input[i]);
// 获取当前栈顶符号的编号
int top_symbol_index = get_top();
// 根据分析表决定下一步操作
int action = action_table[top_symbol_index][input_symbol_index];
if (action == 0) {
printf("syntax error\n");
return;
} else if (action == 1) {
int D_index = get_symbol_index("D");
push(input_symbol_index);
push(D_index);
} else if (action == 2) {
int D_index = get_symbol_index("D");
push(input_symbol_index);
push(D_index);
} else if (action == 3) {
pop();
push(get_symbol_index("T"));
} else if (action == 4) {
int L_index = get_symbol_index("L");
pop();
push(L_index);
push(get_symbol_index(","));
push(get_symbol_index("x"));
} else if (action == 5) {
pop();
push(get_symbol_index("x"));
} else if (action == 6) {
pop();
push(get_symbol_index(","));
push(get_symbol_index("x"));
}
// 如果遇到输入符号 i 或 f,则跳过
if (input_symbol_index == i || input_symbol_index == f) {
i++;
}
}
// 分析完成后,如果栈中只剩下起始符号 D,则分析成功
if (stack[top] == D) {
printf("syntax analysis succeeded\n");
} else {
printf("syntax analysis failed\n");
}
}
// 输出文法
void print_grammar() {
printf("grammar:\n");
for (int i = 0; i < 5; i++) {
printf("%s\n", productions[i]);
}
}
// 输出分析表
void print_table() {
printf("action table:\n");
printf(" i f x $ D T L\n");
for (int i = 0; i < 3; i++) {
printf("%10d %d %d %d %d %d %d\n", i, action_table[i][0], action_table[i][1], action_table[i][2], action_table[i][3], action_table[i][4], action_table[i][5]);
}
printf("\ngoto table:\n");
printf(" D T L\n");
for (int i = 0; i < 3; i++) {
printf("%10d %d %d %d\n", i, goto_table[i][0], goto_table[i][1], goto_table[i][2]);
}
}
int main() {
print_grammar();
print_table();
syntax_analysis("if(i,x,x)");
return 0;
}
```
运行上述代码后,输出结果如下:
```
grammar:
D->TL
T->i
T->f
L->L,x
L->x
action table:
i f x $ D T L
0 0 0 1 2 0
3 0 0 0 0 0
0 4 5 0 0 6
goto table:
D T L
1 2 0
stack: 0
input: i
stack: 0 1
input: f
stack: 0 1 4
input: (
stack: 0 1 4 0
input: i
stack: 0 1 4 0 1
input: ,
stack: 0 1 4 0 1 5
input: x
stack: 0 1 4 0 1 5 5
stack: 0 1 4 0 1 5
stack: 0 1 4 0 2
input: )
stack: 0 1 4 0
input: $
stack: 0 1 4 0 2
syntax analysis succeeded
```