如何获得使用Lex和Yacc程序编写的编译器的解析器树?

时间:2013-06-01 11:09:20

标签: compiler-construction yacc lex

我已经使用Lex和Yacc编写了一个程序。我想知道如何使用这个程序获取解析器树。任何人都可以给我代码来获取它?我用过gcc lex.yy.c y.tab.c -o project.exe

1 个答案:

答案 0 :(得分:2)

Lex / Yacc不会自己构建树,只有当某个规则匹配时,它们才会执行提供的代码。这意味着它非常灵活,但这也意味着您可以编写树构建代码。

幸运的是,建造树木并不是很复杂。查看this link您可以使用的示例。诀窍是你可以使用yacc的语义值($$和朋友)来传递树节点:

input  : exp ';'               {do_something_with($1);}
       ;

exp    : '+' term              {$$ = $2;}
       | '-' term              {$$ = make_operator(NULL, '~', $2);}
       | term                  {$$ = $1;}
       | exp '+' term          {$$ = make_operator($1, '+', $3);}
       | exp '-' term          {$$ = make_operator($1, '-', $3);}
       ;

term   : factor                {$$ = $1;}
       | term '*' factor       {$$ = make_operator($1, '*', $3);}
       | term '/' factor       {$$ = make_operator($1, '/', $3);}
       ;

factor : number                {$$ = make_number($1);}
       | variable              {$$ = make_variable($1);}
       | '(' exp ')'           {$$ = $2;}
       ;

显然,您可以定义自己的函数来制作实际的节点。再次,请查看链接以获取示例。