Mercurial > hg > Members > nobuyasu > SampleSource
view Bison-Flex/CALC/Bison-Flex/calc-parser.yy @ 0:db40c85cad7a default tip
upload sample source
author | nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 09 May 2011 03:11:59 +0900 |
parents | |
children |
line wrap: on
line source
%skeleton "lalr1.cc" %define "parser_class_name" "calc_parser" %defines %{ #include <string> #include "node.h" class calc_driver; #ifdef _MSC_VER #pragma warning(disable: 4800) #pragma warning(disable: 4267) #endif %} // The parsing context. %parse-param { calc_driver& driver } %lex-param { calc_driver& driver } // %debug %error-verbose // Symbols. %union { int ival; std::string *sval; cnode *expr; } %{ #include "calc-driver.h" %} %token TK_EOF 0 "end of file" %token <ival> TK_IVAL "ival" %token <sval> TK_IDENTIFIER "identifier" %token TK_PRINT "print" %token TK_LIST "list" %type <expr> expr %destructor { delete $$; } "identifier" %destructor { delete $$; } expr %left '+' '-'; %left '*' '/'; %left NEG; %% %start unit; unit : state | unit state ; state : "identifier" '=' expr '\n' { driver.assign($1, $3); } | "print" expr '\n' { driver.print($2); } | "list" '\n' { driver.list(); } ; expr : expr '-' expr { $$ = new cnode(OP_MINUS, $1, $3); } | expr '+' expr { $$ = new cnode(OP_PLUS, $1, $3); } | expr '*' expr { $$ = new cnode(OP_TIMES, $1, $3); } | expr '/' expr { $$ = new cnode(OP_DIVIDE, $1, $3); } | '-' expr %prec NEG { $$ = new cnode(OP_NEG, $2); } | '(' expr ')' { $$ = $2; } | "identifier" { $$ = new cnode(OP_VALUE, $1); } | "ival" { $$ = new cnode(OP_CONST, $1); } ; %% void yy::calc_parser::error(const yy::calc_parser::location_type&, const std::string& m) { driver.error(m); }