view Bison-Flex/CALC/Bison-Flex/EUC/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);
}