自顶向下递归下降子程序语法分析器C语言代码
时间: 2024-06-23 12:00:34 浏览: 114
自顶向下递归下降子程序语法分析器(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;
}
```
阅读全文