gpt4 book ai didi

c - 在 Bison 代码中使用 yytext

转载 作者:太空宇宙 更新时间:2023-11-04 08:08:07 28 4
gpt4 key购买 nike

当我试图在 yacc&lex 中编译我的代码时,我得到了这个错误: this error

yacc代码:

%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define YYSTYPE struct node*
typedef struct node{
char *token;
struct node *left;
struct node *right;
} node;
node* mknode(char* token, node *left, node *right);
void Printtree(node *tree);
int yyerror();
%}
%token NUM PLUS MINUS
%left PLUS MINUS
%%
S:exp {printf("OK\n"); Printtree($1);};
exp:exp PLUS exp {$$=mknode("+",$1,$3);}
| exp MINUS exp{$$=mknode("-",$1,$3);}
| NUM {$$=mknode(yytext, NULL, NULL);};
%%
#include "lex.yy.c"
int main(){
return yyparse();
}
node *mknode (char *token, node *left, node *right){
node *newnode = (node*)malloc(sizeof(node));
char *newstr = (char*)malloc(sizeof(token)+1);
strcpy (newstr, token);
newnode->left=left;
newnode->right=right;
newnode->token=newstr;
return newnode;
}
void Printtree(node* tree){
printf("%s\n", tree->token);
if (tree->left)
Printtree(tree->left);
if (tree->right)
Printtree(tree->right);
}
int yyerror(){
printf("ERROR\n");
return 0;
}

和 lex 代码

%%
[0-9]+ return NUM;
\+ return PLUS;
\- return MINUS;
%%

当我尝试将 yytext 更改为 $1 时编译但是当我运行代码并键入例如 5+6 时说:(段错误(核心转储))

使用 ubuntu 64:

lex 使用 flex 版本 lex 2.6.0 编译:

lex subProject.lex

和 yacc 使用 bison 版本 bison(GNU Bison) 3.0.4 编译:

yacc subProject.yacc

和错误制造者:

cc subProject -o y.tab.c -ll -Ly

最佳答案

您根本不应该在语法规则中使用 yytext。它并不总是具有您认为可能具有的值(value)。你应该将它保存在扫描仪的 yyunion 中:

[0-9]+ { yylval.text = strdup(yytext); return NUM; }

对于其他需要它的规则也类似,然后像这样在解析器中使用它:

| NUM {$$=mknode($1, NULL, NULL);}

使用常用技术声明 YYUNION 并键入节点。

关于c - 在 Bison 代码中使用 yytext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41253026/

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