使用 GDB 调试时如何知道 bison 中变量的值?

lax*_*xus 4 c++ gdb bison bisonc++

我正在尝试编写一个小型编译器,它可以解析我输入的一些命令。

我尝试解析的命令是:

create class something = create class do_something ; 
Run Code Online (Sandbox Code Playgroud)

我的代码将是这样的:

grammar : my_grammar
        {
            list<Class1 *> *obj = new list<Class1 *>;
            obj->push_back($1);
        }

my_grammar : my_definition SEMICOLON
           {
               report("something detected!");
               $$ = $1;
            }

my_definition : CREATE CLASS class_name EQU class_expression
               {
                   $5->setClassName(*$3);
                   $$ = $5;
                }

class_expression : CREATE CLASS operand_name
                 {
                     $$ = new OperandClass();
                     $$->setOperationType("createClass");
                     $$->setOperandName(*$3);
                  }
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在其他地方调用解析器时,我无法获取Class之前定义的解析器。

我猜解析器肯定有问题,并用GDB做了一些调试。但我就是无法进入该功能push_back(),也无法正确打印信息obj

所以,我想知道是否有一种方法可以在使用 GDB 时获取$$or的值$1。只需输入p $$即可打印其他内容。

for*_*tor 5

如果您将 bison 与 C 模板一起使用,则 bison 有一个变量yyval和一个数组yyvsp,两者的类型都是YYSTYPE,我们使用%unionbisonparser.y文件中的选项来定义它们。规则$$的 是由 的并集成员给出的yyval,产生式中的符号是数组中的成员yyvsp。例如,对于工会:

%union {
  int t1;
  float t2;
}

%type <t1> nt1;
%type <t2> nt2;
%%
input : nt1 | nt2;
nt1 : CONSTANT { $$ = $1; } ;
nt2 : FCONSTANT { $$ = $1 };
%%
int main() { yyparse(); }
Run Code Online (Sandbox Code Playgroud)

使用 gdb 时:

  1. 您可以引用产生式的左手,例如nt1通过它的类型,即$$可以nt1通过以下方式引用yyval.t1
  2. $iRHS 上的 可以通过以下方式引用:yyvsp[i - t].type其中 i 是要引用的符号的索引,t 是产生的符号(终结符和非终结符)的总数。

因此,例如,在这两个规则中可以分别用和$1来引用。yyvsp[1-1].t1yyvsp.[0].t2