自顶向下递归下降子程序语法分析器C语言代码
时间: 2024-06-23 09:00:34 浏览: 8
自顶向下递归下降子程序语法分析器(Top-Down Recursive Descent Parser)是一种简单的解析方法,它从输入的最顶层开始,并逐步解析整个句子。以下是一个基本的C语言实现例子,使用LL(1)分析法,用于解析简单的算术表达式:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef enum { PLUS, MINUS, NUM } Operation;
// 用于存储符号和操作
struct Token {
char symbol;
Operation op;
};
// 定义表达式的结构体
struct Expression {
struct Expression *left, *right;
Operation op;
};
// 递归解析函数
struct Expression *parse_expression(char* input);
struct Token *parse_token(char* input);
int main() {
char input[] = "3 + 4 * 2";
struct Expression *expr = parse_expression(input);
printf("Parsed expression: %d\n", expr->left->value); // 假设我们有一个方法访问值
free(expr);
return 0;
}
// 解析一个算术操作符或数字
struct Token *parse_token(char* input) {
if (isdigit(input[0])) {
char num;
num = input - '0';
if (input == '\0') return (struct Token) { .symbol = 'NUM', .op = NUM };
num = input - '0';
input += 2;
return (struct Token) { .symbol = 'NUM', .op = NUM, .value = atoi(num) };
} else if (input == '+' || input == '-') {
input++;
return (struct Token) { .symbol = input, .op = input == '+' ? PLUS : MINUS };
}
return NULL;
}
// 解析一个表达式
struct Expression *parse_expression(char* input) {
struct Token token = parse_token(input);
if (!token.symbol) return NULL; // 无效输入
struct Expression *expr = malloc(sizeof(struct Expression));
expr->op = token.op;
// 分别处理加减号后的部分
switch (expr->op) {
case PLUS:
expr->left = parse_expression(input);
input = expr->left->symbol == 'NUM' ? input : input + 1;
expr->right = parse_expression(input);
break;
case MINUS:
expr->left = parse_expression(input);
input = expr->left->symbol == 'NUM' ? input : input + 1;
expr->right = parse_expression(input);
break;
default:
break;
}
return expr;
}
```
相关推荐
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)