%skeleton "lalr1.cc" /* -*- C++ -*- */ %require "3.0.4" %defines %define parser_class_name {calcxx_parser} %define api.token.constructor %define api.value.type variant %define parse.assert %code requires { # include class calcxx_driver; } // The parsing context. %param { calcxx_driver& driver } %locations %initial-action { // Initialize the initial location. @$.begin.filename = @$.end.filename = &driver.file; }; %define parse.trace %define parse.error verbose %code { # include "calc++-driver.hh" } %define api.token.prefix {TOK_} %token END 0 "end of file" ASSIGN ":=" MINUS "-" PLUS "+" STAR "*" SLASH "/" LPAREN "(" RPAREN ")" ; %token IDENTIFIER "identifier" %token NUMBER "number" %type exp %printer { yyoutput << $$; } <*>; %% %start unit; unit: assignments exp { driver.result = $2; }; assignments: %empty {} | assignments assignment {}; assignment: "identifier" ":=" exp { driver.variables[$1] = $3; }; %left "+" "-"; %left "*" "/"; exp: exp "+" exp { $$ = $1 + $3; } | exp "-" exp { $$ = $1 - $3; } | exp "*" exp { $$ = $1 * $3; } | exp "/" exp { $$ = $1 / $3; } | "(" exp ")" { std::swap ($$, $2); } | "identifier" { $$ = driver.variables[$1]; } | "number" { std::swap ($$, $1); }; %% void yy::calcxx_parser::error (const location_type& l, const std::string& m) { driver.error (l, m); }