C ++中的标记及其使用方式

时间:2017-07-29 21:27:59

标签: c++ token tokenize

在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 ++中使用令牌来编写程序的任何示例,我只能对令牌的含义进行模糊定义。如果有人可以帮助我理解令牌,或者可能指向一个好的来源,我可以得到一个彻底的解释,我们将不胜感激。

2 个答案:

答案 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");
        }
    }