C 如何扫描输入字符串中的令牌流

C 如何扫描输入字符串中的令牌流,c,tokenize,C,Tokenize,我正在做一个简单的词法分析器C程序。我首先要做的是标记输入的语句。(示例语句:printf1234=--abc) 如何使用strtok()来分隔“printf”、“1234”、“=”、“--”和“abc” 以下是我的实验代码: #include <stdio.h> #include <string.h> #include <conio.h> void main() { char input_string[100]; char string_s

我正在做一个简单的词法分析器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();
}
#包括
#包括
#包括
void main()
{
字符输入_字符串[100];
字符字符串_存储[100][100];
字符*令牌;
printf(“输入字符串:”);
获取(输入字符串);
token=strtok(输入字符串“”);
while(令牌!=NULL)
{
printf(“%s\n”,标记);
//strcpy(输入\存储,令牌);
令牌=strtok(空,“”);
}
getch();
}

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

正如您现在理解的那样,strtok您不能在这里使用。因为您不能为输入使用特定的分隔符集。或者,即使您可以这样做,也不足以使用通用标记器

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

这就是所谓的词法分析是编译器设计。这里没有相关的意义。既然你没有提到任何语义上的东西,你也可以到此为止。也许你可以看看这个,了解一些情况。如果这是不需要的,或者在这个细节中你不需要,那么你必须创建一些自动机来为你做到这一点。(正则表达式处理就是您要做的事情)


关于这一点的有趣讨论可以在龙书中找到。如果你想更深入地挖掘,请仔细阅读它。

空格不是分隔符……那么为什么要使用它呢?
strtok
取决于标记之间是否有分隔符(或一组分隔符);对于您的特定示例字符串,
strtok
不是正确的工具。不要使用strtok进行令牌解析,最好是手动构建令牌解析器。添加到@JohnBode注释中,我强烈感觉您必须编写自己的函数(使用regex)来实现您想要做的事情。因为我的讲师会输入如下随机语句“abc++scanf=printf”,因此定界符是没有用的。我不知道应该使用什么样的定界符来标记这种语句并分隔“abc”、“+”、“scanf”、“=”、“printf”“严格地说,使用标准的编译器构造术语,我认为OP还没有达到语义级别。OP需要一个通用的扫描器来将输入流分解成标记(如他们所说的“标记化输入”)。然后对一系列标记进行解析(例如,解析到解析树中),然后应用语义。是的,严格地说,你是对的,语义这个词可能会产生误导。这个想法是为了给她一些常识,让她理解定界符和模式搜索之间的区别。如果OP决定学习一些关于这个主题的行业教科书,并遇到语义分析,我只是不想让他们被这搞糊涂。:)现在你有了,谢谢。这是我现在应该做的最好的事情,因为我唯一的问题是分离关键字(scanf,printf)。:)