第十题答案

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

/* 令牌类型 */
typedef enum {
    TOKEN_KEYWORD,      // 关键字
    TOKEN_IDENTIFIER,   // 标识符
    TOKEN_CONSTANT,     // 常量
    TOKEN_OPERATOR,     // 运算符
    TOKEN_DELIMITER     // 分隔符
} TokenType;

/* 令牌结构 */
typedef struct {
    TokenType type;     // 令牌类型
    char value[100];    // 令牌值
} Token;

/* 全局变量 */
char source[1000];      // 源代码
Token tokens[100];      // 令牌
int num_tokens = 0;     // 令牌数目
int current_token = 0;  // 当前令牌的索引

/* 函数原型 */
void lex();             // 词法分析器
void parse();           // 语法分析器
void program();         // 程序

/* 符号表 */
typedef struct {
    char name[100];     // 变量名
    int value;          // 变量值
} Symbol;

Symbol symbols[100];    // 符号表
int num_symbols = 0;    // 符号数目

/* 解释器 */
int evaluate_expression();
int evaluate_term();
int evaluate_factor();
int get_symbol_index(char *name);

int main() {
    /* 读取源代码 */
    printf("请输入源代码:\n");
    fgets(source, sizeof(source), stdin);

    /* 对源代码进行词法分析 */
    lex();

    /* 对令牌流进行语法分析和解释 */
    parse();

    return 0;
}

/* 词法分析器 */
void lex() {
    char ch;
    int i = 0;
    while ((ch = source[i]) != '\0') {
        if (isspace(ch)) {  // 空白字符
            i++;
            continue;
        } else if (isalpha(ch)) {  // 标识符或关键字
            int j = 0;
            while (isalnum(ch)) {
                tokens[num_tokens].value[j++] = ch;
                ch = source[++i];
            }
            tokens[num_tokens].value[j] = '\0';
            if (strcmp(tokens[num_tokens].value, "if") == 0 ||
                strcmp(tokens[num_tokens].value, "else") == 0 ||
                strcmp(tokens[num_tokens].value, "while") == 0) {
                tokens[num_tokens].type = TOKEN_KEYWORD;
            } else {
                tokens[num_tokens].type = TOKEN_IDENTIFIER;
            }
            num_tokens++;
        } else if (isdigit(ch)) {  // 数字常量
            int j = 0;
            while (isdigit(ch)) {
                tokens[num_tokens].value[j++] = ch;
                ch = source[++i];
            }
            tokens[num_tokens].value[j] = '\0';
            tokens[num_tokens].type = TOKEN_CONSTANT;
            num_tokens++;
        } else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {  // 运算符
            tokens[num_tokens].value[0] = ch;
            tokens[num_tokens].value[1] = '\0';
            tokens[num_tokens].type = TOKEN_OPERATOR;
            num_tokens++;
            i++;
        } else if (isdigit(ch)) {  // 数字常量
            int j = 0;
            while (isdigit(ch)) {
                tokens[num_tokens].value[j++] = ch;
                ch = source[++i];
            }
            tokens[num_tokens].value[j] = '\0';
            tokens[num_tokens].type = TOKEN_CONSTANT;
            num_tokens++;
        } else if (ch == '\'' || ch == '\"') {  // 字符常量或字符串常量
            char delimiter = ch;
            int j = 0;
            tokens[num_tokens].value[j++] = ch;
            ch = source[++i];
            while (ch != delimiter) {
                tokens[num_tokens].value[j++] = ch;
                ch = source[++i];
            }
            tokens[num_tokens].value[j++] = ch;
            tokens[num_tokens].value[j] = '\0';
            tokens[num_tokens].type = TOKEN_CONSTANT;
            num_tokens++;
            i++;
        } else if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '%' ||
                   ch == '>' || ch == '<' || ch == '=' || ch == '!') {  // 运算符
            int j = 0;
            while (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '%' ||
                   ch == '>' || ch == '<' || ch == '=' || ch == '!') {
                tokens[num_tokens].value[j++] = ch;
                ch = source[++i];
                if (ch == '=') {
                    tokens[num_tokens].value[j++] = ch;
                    ch = source[++i];
                }
            }
            tokens[num_tokens].value[j] = '\0';
            tokens[num_tokens].type = TOKEN_OPERATOR;
            num_tokens++;
        } else {  // 分隔符
            tokens[num_tokens].value[0] = ch;
            tokens[num_tokens].value[1] = '\0';
            tokens[num_tokens].type = TOKEN_DELIMITER;
            num_tokens++;
            i++;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值