用c++写一个编程语言
编写一个完整的编程语言需要经过多个步骤,包括词法分析、语法分析、语义分析、代码生成等。以下是一个简单的编程语言的实现示例:
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
// Token 类型
enum class TokenType {
INTEGER,
PLUS,
MINUS,
MUL,
DIV,
LPAREN,
RPAREN,
EOF
};
// Token 结构体
struct Token {
TokenType type;
std::string value;
};
// Lexer 类
class Lexer {
public:
Lexer(const std::string& text) : text(text), pos(0) {}
void error() {
throw std::runtime_error("Invalid character");
}
void skipWhitespace() {
while (pos < text.length() && isspace(text[pos])) {
pos++;
}
}
Token getNextToken() {
if (pos >= text.length()) {
return Token{TokenType::EOF, ""};
}
if (isdigit(text[pos])) {
std::string value;
while (pos < text.length() && isdigit(text[pos])) {
value += text[pos++];
}
return Token{TokenType::INTEGER, value};
}
switch (text[pos]) {
case '+':
pos++;
return Token{TokenType::PLUS, "+"};
case '-':
pos++;
return Token{TokenType::MINUS, "-"};
case '*':
pos++;
return Token{TokenType::MUL, "*"};
case '/':
pos++;
return Token{TokenType::DIV, "/"};
case '(':
pos++;
return Token{TokenType::LPAREN, "("};
case ')':
pos++;
return Token{TokenType::RPAREN, ")"};
default:
error();
}
}
private:
std::string text;
size_t pos;
};
// Parser 类
class Parser {
public:
Parser(Lexer& lexer) : lexer(lexer), currentToken(lexer.getNextToken()) {}
void error() {
throw std::runtime_error("Invalid syntax");
}
void eat(TokenType type) {
if (currentToken.type == type) {
currentToken = lexer.getNextToken();
} else {
error();
}
}
int factor() {
Token token = currentToken;
eat(TokenType::INTEGER);
return stoi(token.value);
}
int term() {
int result = factor();
while (currentToken.type == TokenType::MUL || currentToken.type == TokenType::DIV) {
Token token = currentToken;
if (token.type == TokenType::MUL) {
eat(TokenType::MUL);
result *= factor();
} else if (token.type == TokenType::DIV) {
eat(TokenType::DIV);
result /= factor();
}
}
return result;
}
int expr() {
int result = term();
while (currentToken.type == TokenType::PLUS || currentToken.type == TokenType::MINUS) {
Token token = currentToken;
if (token.type == TokenType::PLUS) {
eat(TokenType::PLUS);
result += term();
} else if (token.type == TokenType::MINUS) {
eat(TokenType::MINUS);
result -= term();
}
}
return result;
}
int parse() {
return expr();
}
private:
Lexer& lexer;
Token currentToken;
};
// 主函数
int main() {
std::string input;
std::cout << "Enter an expression: ";
std::getline(std::cin, input);
Lexer lexer(input);
Parser parser(lexer);
int result = parser.parse();
std::cout << "Result: " << result << std::endl;
return 0;
}
上述代码实现了一个简单的四则运算编程语言,可以读取用户输入的数学表达式并计算结果。该编程语言支持整数、加法、减法、乘法、除法以及括号等基本语法
原文地址: https://www.cveoy.top/t/topic/iV2u 著作权归作者所有。请勿转载和采集!