如何将输入字符串读入调车场算法计算器?
How should an input string be read into a shunting yard algorithm calculator?
我已经实现了 shunting yard algorithm 的基本结构,但我不确定如何读入多位数或函数的值。这是我目前要阅读的值:
string input;
getline(cin, input);
input.erase(remove_if(input.begin(), input.end(), ::isspace), input.end());
//passes into function here
for (int i = 0; i < input.length(); ++i) {
string s = input.substr(i, 1);
//code continues
}
如您所见,该方法一次只能解析一个字符,缺陷极大。我也尝试过搜索阅读值或解析它们,但没有找到与此处相关的结果。
为了 运行 调车场,您需要先标记您的字符串。也就是把12+4
变成{'12','+','4'}
。然后你就可以用代币去运行调车场了。一个朴素的中缀词法分析算法可能是这样的:
lex(string) {
buffer = ""
output = {}
for character in string {
if character is not whitespace {
if character is operator {
append buffer to output
append character to output
buffer = ""
} else {
append character to buffer
}
}
append buffer to output
return output
}
真正的词法分析器要复杂得多,并且是编译器设计的主要研究领域。
我已经实现了 shunting yard algorithm 的基本结构,但我不确定如何读入多位数或函数的值。这是我目前要阅读的值:
string input;
getline(cin, input);
input.erase(remove_if(input.begin(), input.end(), ::isspace), input.end());
//passes into function here
for (int i = 0; i < input.length(); ++i) {
string s = input.substr(i, 1);
//code continues
}
如您所见,该方法一次只能解析一个字符,缺陷极大。我也尝试过搜索阅读值或解析它们,但没有找到与此处相关的结果。
为了 运行 调车场,您需要先标记您的字符串。也就是把12+4
变成{'12','+','4'}
。然后你就可以用代币去运行调车场了。一个朴素的中缀词法分析算法可能是这样的:
lex(string) {
buffer = ""
output = {}
for character in string {
if character is not whitespace {
if character is operator {
append buffer to output
append character to output
buffer = ""
} else {
append character to buffer
}
}
append buffer to output
return output
}
真正的词法分析器要复杂得多,并且是编译器设计的主要研究领域。