#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++;
}
}
}
第十题答案
于 2023-02-15 17:49:16 首次发布