如何扫描令牌流的输入字符串
How to scan input string for token stream
我正在做一个简单的词法分析器 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();
}
strtok 是关于在分隔符的基础上进行 spatial 细分。在这里你没有明确的分隔符。您正在寻找 semantic subvision,它基于您期望在每个标记中包含的内容类型。为此,您应该查看 regex 理论。你现在应该限制你的输入语句,例如你有一个文本命令,然后是数字,然后总是一个 = 符号,等等。
正如您现在所理解的那样 strtok
您不能使用 over here.Because 您不能为输入使用特定的定界符集。或者即使你可以那么拥有一个通用的分词器也不够好。
你可以做的是,先决定什么令牌?这样你就会有一些词汇规则来决定标记。例如,4 位数字将是一个令牌,=
将是另一个,依此类推。然后你将有一套获取令牌的规则。在此之前,它要容易得多。这个问题已经解决了。您可以自己应用这些解决方案。
这就是所谓的词法分析是编译器设计。这里没有任何关联的意义。由于您没有提到任何语义,您也可以在这里停下来。 lex
也许你可以看看这个并得到一些想法。如果不需要或者在这个细节上你不需要那么你必须创建一些自动机来为你做这件事。 (正则表达式处理是你要做的)。
有关此的有趣讨论可以在龙书中找到。仔细阅读 - 如果您想深入挖掘。
我正在做一个简单的词法分析器 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();
}
strtok 是关于在分隔符的基础上进行 spatial 细分。在这里你没有明确的分隔符。您正在寻找 semantic subvision,它基于您期望在每个标记中包含的内容类型。为此,您应该查看 regex 理论。你现在应该限制你的输入语句,例如你有一个文本命令,然后是数字,然后总是一个 = 符号,等等。
正如您现在所理解的那样 strtok
您不能使用 over here.Because 您不能为输入使用特定的定界符集。或者即使你可以那么拥有一个通用的分词器也不够好。
你可以做的是,先决定什么令牌?这样你就会有一些词汇规则来决定标记。例如,4 位数字将是一个令牌,=
将是另一个,依此类推。然后你将有一套获取令牌的规则。在此之前,它要容易得多。这个问题已经解决了。您可以自己应用这些解决方案。
这就是所谓的词法分析是编译器设计。这里没有任何关联的意义。由于您没有提到任何语义,您也可以在这里停下来。 lex
也许你可以看看这个并得到一些想法。如果不需要或者在这个细节上你不需要那么你必须创建一些自动机来为你做这件事。 (正则表达式处理是你要做的)。
有关此的有趣讨论可以在龙书中找到。仔细阅读 - 如果您想深入挖掘。