gpt4 book ai didi

thread-safety - 使用 Flex 编写可重入词法分析器

转载 作者:行者123 更新时间:2023-12-04 13:55:32 24 4
gpt4 key购买 nike

我是弯曲的新手。我正在尝试用 flex 编写一个简单的可重入词法分析器/扫描器。词法分析器定义如下。我遇到了如下所示的编译错误(yyg 问题):

可重入.l:

/* Definitions */

digit [0-9]
letter [a-zA-Z]
alphanum [a-zA-Z0-9]
identifier [a-zA-Z_][a-zA-Z0-9_]+
integer [0-9]+
natural [0-9]*[1-9][0-9]*
decimal ([0-9]+\.|\.[0-9]+|[0-9]+\.[0-9]+)

%{
#include <stdio.h>

#define ECHO fwrite(yytext, yyleng, 1, yyout)

int totalNums = 0;
%}

%option reentrant
%option prefix="simpleit_"

%%

^(.*)\r?\n printf("%d\t%s", yylineno++, yytext);

%%
/* Routines */

int yywrap(yyscan_t yyscanner)
{
return 1;
}

int main(int argc, char* argv[])
{
yyscan_t yyscanner;

if(argc < 2) {
printf("Usage: %s fileName\n", argv[0]);
return -1;
}

yyin = fopen(argv[1], "rb");

yylex(yyscanner);

return 0;
}

编译错误:
vietlq@mylappie:~/Desktop/parsers/reentrant$ gcc lex.simpleit_.c 
reentrant.l: In function ‘main’:
reentrant.l:44: error: ‘yyg’ undeclared (first use in this function)
reentrant.l:44: error: (Each undeclared identifier is reported only once
reentrant.l:44: error: for each function it appears in.)

最佳答案

对于可重入词法分析器,所有通信都必须包含状态,该状态包含在扫描器中。

在程序中的任何地方(例如在 main 内),您都可以通过将扫描仪传递给的特殊函数来访问状态变量。例如,在您原来的 reentrant.l 中, 你可以这样做:

yyscan_t scanner;
yylex_init(&scanner);
yyset_in(fopen(argv[1], "rb"), scanner);
yylex(scanner);
yylex_destroy(scanner);

我已改名 scanner避免与 yyscanner 混淆在行动中。与一般的 C 代码相比,您的所有操作都发生在一个名为 yylex 的巨大函数中。 ,它以名称 yyscanner 传递给您的扫描仪.因此, yyscanner可用于您的所有操作。另外, yylex有一个名为 yyg 的局部变量保存整个状态,大多数宏方便地引用 yyg .

虽然您确实可以使用 yyin宏内部 main通过定义 yyg正如您在自己的答案中所做的那样,不建议这样做。对于可重入词法分析器,宏仅用于操作。

要了解这是如何实现的,您可以随时查看生成的代码:

/* For convenience, these vars
are macros in the reentrant scanner. */
#define yyin yyg->yyin_r
...

/* Holds the entire state of the reentrant scanner. */
struct yyguts_t
...

#define YY_DECL int yylex (yyscan_t yyscanner)

/** The main scanner function which does all the work.
*/
YY_DECL
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
...
}
reentrant 上还有更多内容 中的选项柔性 docs,其中包括一个干净的编译示例。 (谷歌“flex reentrant”,寻找 flex.sourceforge 链接。)与 不同野牛 , 柔性 有一个相当直接的可重入模型。我强烈建议使用可重入 柔性 Lemon Parser ,而不是用 yacc/野牛 .

关于thread-safety - 使用 Flex 编写可重入词法分析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2634998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com