我需要代码用c或c++
时间: 2024-02-26 08:58:17 浏览: 15
好的,词法分析是编译原理中的重要一环,其主要任务是将源程序中的字符序列转化为有意义的单词序列,即记号流。下面是一个简单的C++代码实现词法分析器,你可以参考一下:
```cpp
#include <iostream>
#include <string>
using namespace std;
// 定义记号
enum TokenType {
TOK_INT, // 整型
TOK_FLOAT, // 浮点数
TOK_ADD, // 加号
TOK_SUB, // 减号
TOK_MUL, // 乘号
TOK_DIV, // 除号
TOK_LPAREN, // 左括号
TOK_RPAREN // 右括号
};
// 定义记号结构体
struct Token {
TokenType type; // 记号类型
string value; // 记号值
};
// 词法分析器
class Lexer {
public:
Lexer(string input) : input(input), pos(0) {}
Token getNextToken() {
while (pos < input.length()) {
char currentChar = input[pos];
if (isdigit(currentChar)) {
return parseNumber();
}
switch (currentChar) {
case '+':
pos++;
return Token{TOK_ADD, "+"};
case '-':
pos++;
return Token{TOK_SUB, "-"};
case '*':
pos++;
return Token{TOK_MUL, "*"};
case '/':
pos++;
return Token{TOK_DIV, "/"};
case '(':
pos++;
return Token{TOK_LPAREN, "("};
case ')':
pos++;
return Token{TOK_RPAREN, ")"};
default:
cerr << "Unknown token: " << currentChar << endl;
pos++;
break;
}
}
return Token{TOK_EOF, ""};
}
private:
Token parseNumber() {
string value;
bool hasDot = false;
while (pos < input.length()) {
char currentChar = input[pos];
if (isdigit(currentChar)) {
value += currentChar;
pos++;
} else if (currentChar == '.' && !hasDot) {
value += currentChar;
hasDot = true;
pos++;
} else {
break;
}
}
if (hasDot) {
return Token{TOK_FLOAT, value};
} else {
return Token{TOK_INT, value};
}
}
string input; // 输入的源代码
int pos; // 当前位置
};
// 测试
int main() {
string input = "3.14 + 2 * (4 - 5)";
Lexer lexer(input);
Token token = lexer.getNextToken();
while (token.type != TOK_EOF) {
cout << "Type: " << token.type << ", Value: " << token.value << endl;
token = lexer.getNextToken();
}
return 0;
}
```
这个代码实现了一个简单的四则运算表达式的词法分析器,可以识别整型和浮点数、加减乘除和括号等记号。你也可以根据需要进行修改和扩展。