gpt4 book ai didi

c - x1 + x2 +...+xn 的解析器和扫描器

转载 作者:太空宇宙 更新时间:2023-11-03 23:28:11 25 4
gpt4 key购买 nike

我正在尝试创建一个解析器扫描器,它将获取一个文件作为输入,该文件内部包含这样的内容:5 + 23 + ..... + 3; 我想要它将结果打印在屏幕上。

我发现有点难以理解 $$ = $1 +... 的工作原理以及这些 $1$2 的工作原理与 token 相关联。如果有人能向我解释那部分,我将不胜感激。

到目前为止我的代码是这样的:

词法代码:

%option noyywrap
%%
\+ //{ yylval.p = yytext[0]; return PLUS; }
; //{ yylval.q = yytext[0]; return Q_MARK; }
0|([-+]?(([1-9][0-9]*)|(0\.[0-9]+)|([1-9][0-9]*\.[0-9]+))) { yylval.d = atof(yytext); return NUMBER; }
%%

弹性代码:

%defines

%{
#include <stdio.h>
#include <stdlib.h>
%}

%union {
double d;
}

%token <d> NUMBER //some number
%token PLUS // +
%token Q_MARK // ;
%start addition_list
%%

addition_list : addition Q_MARK {}
| addition_list addition Q_MARK {}
;

addition : NUMBER PLUS NUMBER { }
| addition PLUS NUMBER { }
;

%%
int yyerror(char *message)
{
return 0;
}
void main()
{
yyparse();
}

ps:我有一些关于它应该是什么样子的说明,所以这就是为什么它是这样的。无论您能给我什么线索,我都将不胜感激,因为我发现很难理解互联网指南(尽管仍在尝试)。

最佳答案

我不想深入探讨 flex 和 bison,所以我尽量简单地解释一下。

$$ 可以解释为语法规则的返回值,一旦语法规则被解析器完成(reduced)$$值将通过。

例如,规则:

addition : NUMBER PLUS NUMBER { }

curl 手镯的内部称为 Action 规则。 $1 $2 $3 ... 代表规则的第一个、第二个和第三个参数。

这意味着:

$1 = NUMBER
$2 = PLUS
$3 = NUMBER

如果您想将 NUMBER 添加到另一个 NUMBER,您必须在操作规则中编写如下内容:

addition : NUMBER PLUS NUMBER { printf("%d",$1+$3);}

Lexer 类似于解析器的子程序,解析器请求下一个符号,flex 扫描输入以寻找下一个符号并将其传递给 bison。

有一点要提:解析器不知道数字里面是什么,他只是得到符号 NUMBER。这就是为什么你的 flex/bison 需要这样的东西:

弹性文件:

[0-9]+   { yylval.val = atoi(yytext); return NUMBER; }

Bison :

%union {
int val;
};
%token <val> NUMBER

扫描到 NUMBER 符号后,flex 会将其值写入 val 变量,以便 bison 可以访问它。

为了更好地理解会发生什么,我建议您在每个语法规则中执行一些 printf。希望对您有所帮助!

关于c - x1 + x2 +...+xn 的解析器和扫描器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21886613/

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