Получить результат действия Flex / Bison - PullRequest
6 голосов
/ 24 декабря 2010

Я использую Flex / Bison / C ++ для оценки выражения. Вот пример файла зубров

string res; 
yy_scan_string(expression.c_str());               

yyparse();
cout<<"Result:"<<res<<"\n";
....
expr: expr PLUS expr { 
          $$=evaluate("+",$1,$3);
          res=$$;
          } 
     |expr MINUS expr { 
          $$=evaluate("-",$1,$3);
          res=$$;
          } 

Вместо использования переменной res и сохранения значения в каждом действии, существует ли стандартyylval) способ получить доступ к конечному результату после yyparse ()?

1 Ответ

8 голосов
/ 24 декабря 2010

Да.

Имейте правило верхнего уровня, которое просто выполняет назначение:

%%
    toplev:   expr                    { res = $1; }
    expr:     expr PLUS expr          { $$=evaluate("+",$1,$3);}
           |  expr MINUS expr         { $$=evaluate("-",$1,$3);} 
%%
...