【问题标题】:printing token in grammar in bison(yacc)在野牛(yacc)中以语法打印标记
【发布时间】:2021-12-04 22:07:49
【问题描述】:

我在使用 bison 代码中的令牌时遇到问题 我通过以下方式定义了令牌:

#define YYSTYPE struct node*

typedef struct node{
char* token;
node* left;
node* right;
}node; 

我的部分语法是:

%token STRING CHARVAL VOID



s: code
code: rettype name ;
rettype: VOID 
name: STRING|CHARVAL;

是否可以做类似的事情:

rettype: VOID {printf("%s",$1->token);}

rettype: VOID {$$ = $1;}

我正在测试的部分代码只是:

void foo

这是我现在的主要问题... 当我尝试这个时,我得到了这个错误:Segmentation fault(core dumped) 我试图在任何地方找到解释或解决方案,但没有找到或没有充分理解它们,有人可以指导我解决这个问题吗?

【问题讨论】:

  • 很可能,您的词法分析器在返回令牌之前没有正确设置yylval。但是您没有显示您的词法分析器代码。

标签: compiler-construction bison yacc


【解决方案1】:

Bison 依赖于词法分析器正确设置 yylval 全局变量,并将任何标记类型信息作为它提供给 Bison 的标记的一部分。如果你使用 flex,你可能需要/想要类似的东西:

"void"    { yylval.token = "void";
            yylval.left = yylval.right = 0;
            return VOID }
[a-z]*    { yylval.token = strdup(yytext);
            yylval.left = yylval.right = 0;
            return STRING; }

将 yylval 的 每个字段 设置为合理的值很重要,这将在随后对 yylex 的调用中持续存在(因此调用 strdup 而不是直接使用 yytext,因为 yytext 会改变)。

【讨论】:

  • 我试过你的建议,报错:invalid use of undefined type struct node
  • 您需要将结构节点的定义包含在您包含在词法分析器中的头文件中。
  • 结构节点是在 yacc 文件中定义的,如果我尝试在 lex 文件中定义它,分段错误会在一开始就出现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多