我正在做一个简单的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();
}
答案 0 :(得分:3)
strtok是基于分隔符进行空间细分。在这里你没有清晰的分界仪。您正在寻找语义子视图,它基于您希望在每个令牌中拥有的内容类型。你应该看一下正则表达式理论。你现在应该输入你的输入语句的约束,例如你有一个文本命令,然后是数字,然后总是a =符号等。
答案 1 :(得分:0)
正如你现在所理解的那样strtok
你不能在这里使用。因为你不能为输入使用特定的分隔符集。或者即使你可以,那么拥有一个通用的标记器就不够了。
你能做的是,首先简单地决定什么是令牌?这样你就会有一些词汇规则来决定令牌。例如,4位数字将是一个标记,=
将是另一个,依此类推。然后你将有一套获取令牌的规则。在此之前,它要容易得多。这个问题已经解决了。您可以自己应用这些解决方案。
这被称为词法分析是编译器设计。这里没有任何意义。由于你没有提到任何语义,你也可以在这里停下来。 lex
也许你可以看看这个并得到一些想法。如果不需要,或者在这个细节中你不需要那么你必须创建一些自动机,它将为你做到这一点。 (你将采用正则表达式处理)。
有关这方面的有趣讨论可以在龙书中找到。通过它 - 如果你想深入挖掘。