2、用c语言编写一个词法分析器,该词法分析器能够识别并输出加减乘除运算符
时间: 2024-09-19 07:10:16 浏览: 40
在C语言中,为了编写一个识别并输出加减乘除运算符的词法分析器,我们需要定义一些标识符(tokens)来代表这些特定的运算符,并在输入流中寻找它们。以下是一个基础的实现:
```c
#include <stdio.h>
#include <ctype.h>
enum Operation {
PLUS,
MINUS,
TIMES,
DIVIDE
};
typedef enum { NOT_OPERATOR, OPERATOR } State;
struct Token {
enum Operation op;
char type;
};
State lex(char* input) {
State state = NOT_OPERATOR;
struct Token token;
while (*input != '\0') {
if (*input == '+' || *input == '-') {
token.op = (*input == '+') ? PLUS : MINUS;
token.type = OPERATOR;
++input;
return state = OPERATOR;
} else if (*input == '*' || *input == '/') {
token.op = (*input == '*') ? TIMES : DIVIDE;
token.type = OPERATOR;
++input;
return state = OPERATOR;
} else if (!isspace(*input)) { // 非空格和运算符时,结束当前操作符处理
break;
} else { // 遇到空格,跳过
++input;
}
}
return state;
}
void print_token(struct Token token) {
switch (token.op) {
case PLUS:
printf("+");
break;
case MINUS:
printf("-");
break;
case TIMES:
printf("*");
break;
case DIVIDE:
printf("/");
break;
default:
printf("Invalid operator");
}
printf("\n");
}
int main() {
char input[] = "a + b * c / d";
char* current_input = input;
while (*current_input != '\0') {
State state = lex(current_input);
if (state == OPERATOR) {
print_token((struct Token){.op = token.op, .type = OPERATOR});
}
while (isspace(*current_input)) {
++current_input;
}
}
return 0;
}
```
这个词法分析器会从输入字符串开始,检测每个字符是否是+、-、*或/,如果是就会创建一个`Token`结构体并输出相应的运算符。如果不是运算符或空格,就跳出当前的操作符处理。
阅读全文