解释器的目的是将输入进行解释,方便后续处理。
解析整数
例如常见的atoi函数,以下写的是无检错功能的atoi函数
int atoi(const char* str) {
int val{ 0 };
while (*str) {
val = val * 10 + (*str-'0');
}
return val;
}
词法分析器
接下来的函数实现了将表达式进行词法分析
struct Token {
enum Type {integer,plus,minus,lparen,rparen} type;
string text;
explicit Token(Type type, const string& text) :type{ type }, text{text}{}
friend ostream& operator<<(ostream& os, const Token& obj) {
return os << "`" << obj.text << "`";
}
};
vector<Token> lex(const string& input) {
vector<Token> result;
string temp;
for (int i = 0; i < input.size(); i++) {
switch (input[i]) {
case '+':
if (temp.size() > 0) {
result.emplace_back(Token::integer, temp);
temp.clear();
}
result.emplace_back(Token::plus, "+");
break;
case '-':
if (temp.size() > 0) {
result.emplace_back(Token::integer, temp);
temp.clear();
}
result.emplace_back(Token::minus, "-");
break;
case '(':
if (temp.size() > 0) {
result.emplace_back(Token::integer, temp);
temp.clear();
}
result.emplace_back(Token::lparen, "(");
break;
case ')':
if (temp.size() > 0) {
result.emplace_back(Token::integer, temp);
temp.clear();
}
result.emplace_back(Token::rparen, ")");
break;
default:
temp += input[i];
}
}
if (temp.size() > 0) {
result.emplace_back(Token::integer, temp);
temp.clear();
}
return result;
}
解释器模式相比于其他模式不太常见,只有当计划从事语言设计和静态代码分析工具时可能会用到。