如何扫描令牌流

时间:2018-01-09 15:05:23

标签: c tokenize

我正在做一个简单的Lexical Analyzer C程序。我首先要做的是标记输入的语句。 (示例声明:printf1234 = --- abc)

如何使用strtok()分隔“printf”,“1234”,“=”,“---”和“abc”?

这是我的实验代码:

#include <stdio.h>
#include <string.h>
#include <conio.h>

void main()
{
    char input_string[100];
    char string_storage[100][100];
    char *token;

    printf("Enter a string: ");
    gets(input_string);

    token = strtok(input_string, " ");
    while(token != NULL)
    {
        printf("%s\n",token);
        //strcpy(input_storage,token);
        token = strtok(NULL, " ");
    }
    getch();
}

2 个答案:

答案 0 :(得分:3)

strtok是基于分隔符进行空间细分。在这里你没有清晰的分界仪。您正在寻找语义子视图,它基于您希望在每个令牌中拥有的内容类型。你应该看一下正则表达式理论。你现在应该输入你的输入语句的约束,例如你有一个文本命令,然后是数字,然后总是a =符号等。

答案 1 :(得分:0)

正如你现在所理解的那样strtok你不能在这里使用。因为你不能为输入使用特定的分隔符集。或者即使你可以,那么拥有一个通用的标记器就不够了。

你能做的是,首先简单地决定什么是令牌?这样你就会有一些词汇规则来决定令牌。例如,4位数字将是一个标记,=将是另一个,依此类推。然后你将有一套获取令牌的规则。在此之前,它要容易得多。这个问题已经解决了。您可以自己应用这些解决方案。

这被称为词法分析是编译器设计。这里没有任何意义。由于你没有提到任何语义,你也可以在这里停下来。 lex也许你可以看看这个并得到一些想法。如果不需要,或者在这个细节中你不需要那么你必须创建一些自动机,它将为你做到这一点。 (你将采用正则表达式处理)。

有关这方面的有趣讨论可以在龙书中找到。通过它 - 如果你想深入挖掘。