我已经使用Lex和Yacc编写了一个程序。我想知道如何使用这个程序获取解析器树。任何人都可以给我代码来获取它?我用过gcc lex.yy.c y.tab.c -o project.exe
答案 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;}
;
显然,您可以定义自己的函数来制作实际的节点。再次,请查看链接以获取示例。