在Bjarne Stroustrup的书"编程原则和实践中使用C ++",他解释了如何使用令牌来阻止C ++自动使用简单计算器上的操作顺序。他在书中给出的代码不起作用 - 要么是因为我的愚蠢,要么是因为我遗漏了某些东西。我知道令牌基本上是将代码行分解为字符。例如,如果我有5 * 3,则有3个令牌。两个值和一个字符。我不知道如何加入令牌,或者为什么要使用它们。 Bjarne的用户定义令牌的例子是:
class Token {
public:
char kind; // what kind of token
double value; // for numbers - a value
Token(char ch) // make a token from a char using a constructor
:kind(ch), value(0) {} // set kind to ch and value to val
Token(char ch, double val) // make a Token from a char and a double
:kind(ch), value(val) {}
};
此外,他还提供了如何将输入读入标记向量的示例:
Token get_token() {} // read a token from cin
vector<Token> tok; // put the tokens in this vector
while(cin >> t5) {
Token t5 = get_token();
tok.push_back(t5);
}
return 0;
首先...... 1)他将&#34; get_token()&#34;功能,但他甚至没有为它编写任何代码。 2)令牌的对象&#39;&#39;它已经在while循环中读取后被初始化了。 3)我已经尝试了许多方法来获取cin来读取输入到t5,但它无法正常工作。我甚至在while循环之前定义了t5,并且我为&#39;&gt;&gt;&#39;获得了无效的操作数错误。这是我第一次完全陷入困境。我无法在网上找到如何在C ++中使用令牌来编写程序的任何示例,我只能对令牌的含义进行模糊定义。如果有人可以帮助我理解令牌,或者可能指向一个好的来源,我可以得到一个彻底的解释,我们将不胜感激。
答案 0 :(得分:1)
首先,Stroustrup不是一位优秀的教师,如果你正在学习编程,你可能会更好地建议从C ++以外的地方开始,除了他的书之外的其他地方。
要解决您的问题,令牌是一个词法元素,而 究竟是什么取决于您要解决的问题。例如,如果您正在处理算术表达式:
100+2/3
然后,令牌将是&#34; 100&#34;,&#34; +&#34;,&#34; 2&#34;,&#34; /&#34;和&#34; 3&#34;。另一方面,如果你正在处理英文文本:
"Here we go again"
然后令牌可能是:
"Here", "we", "go", again"
我们只是丢弃空格字符。
你如何使用令牌&#34;?好吧,假设你想写一个拼写检查器 - 你需要将文本分解为单词和标点符号(不同类型的标记),可能会丢弃大多数标点符号,然后在某种字典中查找单词标记。 / p>
答案 1 :(得分:0)
在这里,您是第一个问题的答案。这就是您要的get_token()
函数!
Here是下面的链接(直接从Stroustrup的网站:)):
Token get_token() // read a token from cin
{
char ch;
cin >> ch; // note that >> skips whitespace (space, newline, tab, etc.)
switch (ch) {
//not yet case ';': // for "print"
//not yet case 'q': // for "quit"
case '(': case ')': case '+': case '-': case '*': case '/':
return Token(ch); // let each character represent itself
case '.':
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
{
cin.putback(ch); // put digit back into the input stream
double val;
cin >> val; // read a floating-point number
return Token('8',val); // let '8' represent "a number"
}
default:
error("Bad token");
}
}