Mercurial > hg > Members > nobuyasu > myCompiler
diff Bison-Flex/BasicCompiler-StackBase/script-parser.yy @ 2:fbe42292d479
upload test
author | nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 10 May 2011 06:43:55 +0900 |
parents | a3ea4c73696b |
children |
line wrap: on
line diff
--- a/Bison-Flex/BasicCompiler-StackBase/script-parser.yy Tue May 10 06:26:08 2011 +0900 +++ b/Bison-Flex/BasicCompiler-StackBase/script-parser.yy Tue May 10 06:43:55 2011 +0900 @@ -1,138 +1,138 @@ -%skeleton "lalr1.cc" -%define "parser_class_name" "script_parser" -%defines -%{ -#ifdef _MSC_VER -#pragma warning(disable: 4800) -#pragma warning(disable: 4267) -#endif - -#include <string> -#include "node.h" -class compiler; -%} -// The parsing context. -%parse-param { compiler& driver } -%lex-param { compiler& driver } -%locations -//%expect 7 -%initial-action -{ - // ロケーション初期化 - @$.begin.filename = @$.end.filename = &driver.get_filename(); -}; -// %debug -%error-verbose -// Symbols. -%union -{ - int ival; - std::string *sval; - - CArgs *args; - CNode *expr; - CAssign *assign; -} -%{ -#include "compiler.h" -%} - -%token END_OF_FILE 0 "end of file" -%token <ival> TK_IVAL "ival" -%token <sval> TK_IDENTIFIER "identifier" -%token TK_EQ "==" -%token TK_NE "!=" -%token TK_GE ">=" -%token TK_LE "<=" -%token TK_NEWLINE "\n" - -%token TK_IF "if" -%token TK_THEN "then" -%token TK_ELSE "else" -%token TK_ENDIF "endif" -%token TK_FOR "for" -%token TK_TO "to" -%token TK_NEXT "next" -%token TK_WHILE "while" -%token TK_WEND "wend" -%token TK_END "end" -%token TK_RAND "rand" -%token TK_PRINT "print" - -%type <expr> expr -%type <expr> comp_expr -%type <expr> value -%type <assign> assign -%type <args> args - -%destructor { delete $$; } "identifier" - -%destructor { delete $$; } args -%destructor { delete $$; } assign -%destructor { delete $$; } value -%destructor { delete $$; } expr -%destructor { delete $$; } comp_expr - -%left '+' '-'; -%left '*' '/' '%'; -%left NEG; -%% -%start unit; - -unit : states - | unit states - ; - -states : statement "\n" - | "\n" - ; - -statement : "end" { driver.EndStatement(@1); } - | assign { driver.AssignStatement(@1, $1); } - | "if" comp_expr "then" { driver.IfStatement(@1, $2); } - | "else" { driver.ElseStatement(@1); } - | "endif" { driver.EndifStatement(@1); } - | "for" assign "to" expr "step" expr { driver.ForStatement(@1, $2, $4, $6); } - | "for" assign "to" expr { driver.ForStatement(@1, $2, $4, NULL); } - | "next" { driver.NextStatement(@1); } - | "while" comp_expr { driver.WhileStatement(@1, $2); } - | "wend" { driver.WendStatement(@1); } - | "print" args { driver.PrintStatement(@1, $2); } - | error /* エラーの場合 */ - ; - -assign : value '=' expr { $$ = new CAssign(@1, '=', $1, $3); } - ; - -comp_expr : expr "==" expr { $$ = CNode::MakeNode(driver, @1, OP_EQ, $1, $3); } - | expr "!=" expr { $$ = CNode::MakeNode(driver, @1, OP_NE, $1, $3); } - | expr '>' expr { $$ = CNode::MakeNode(driver, @1, OP_GT, $1, $3); } - | expr ">=" expr { $$ = CNode::MakeNode(driver, @1, OP_GE, $1, $3); } - | expr '<' expr { $$ = CNode::MakeNode(driver, @1, OP_LT, $1, $3); } - | expr "<=" expr { $$ = CNode::MakeNode(driver, @1, OP_LE, $1, $3); } - ; - -expr : expr '-' expr { $$ = CNode::MakeNode(driver, @1, OP_MINUS, $1, $3); } - | expr '+' expr { $$ = CNode::MakeNode(driver, @1, OP_PLUS, $1, $3); } - | expr '*' expr { $$ = CNode::MakeNode(driver, @1, OP_TIMES, $1, $3); } - | expr '/' expr { $$ = CNode::MakeNode(driver, @1, OP_DIVIDE, $1, $3); } - | expr '%' expr { $$ = CNode::MakeNode(driver, @1, OP_MOD, $1, $3); } - | '-' expr %prec NEG { $$ = CNode::MakeNode(driver, @1, OP_NEG, $2); } - | '(' expr ')' { $$ = $2; } - | value { $$ = $1; } - | "ival" { $$ = new CNode(@1, OP_CONST, $1); } - | "rand" '(' expr ')' { $$ = new CNode(@1, OP_RANDFUNC, $3); } - ; - -value : "identifier" { $$ = new CValueNode(@1, $1); } - ; - -args : expr { $$ = new CArgs(@1, $1); } - | args ',' expr { $$ = $1->Add(@3, $3); } - ; - -%% -void yy::script_parser::error(const yy::script_parser::location_type& l, const std::string& m) -{ - driver.error(l, m); -} +%skeleton "lalr1.cc" +%define "parser_class_name" "script_parser" +%defines +%{ +#ifdef _MSC_VER +#pragma warning(disable: 4800) +#pragma warning(disable: 4267) +#endif + +#include <string> +#include "node.h" +class compiler; +%} +// The parsing context. +%parse-param { compiler& driver } +%lex-param { compiler& driver } +%locations +//%expect 7 +%initial-action +{ + // P[V + @$.begin.filename = @$.end.filename = &driver.get_filename(); +}; +// %debug +%error-verbose +// Symbols. +%union +{ + int ival; + std::string *sval; + + CArgs *args; + CNode *expr; + CAssign *assign; +} +%{ +#include "compiler.h" +%} + +%token END_OF_FILE 0 "end of file" +%token <ival> TK_IVAL "ival" +%token <sval> TK_IDENTIFIER "identifier" +%token TK_EQ "==" +%token TK_NE "!=" +%token TK_GE ">=" +%token TK_LE "<=" +%token TK_NEWLINE "\n" + +%token TK_IF "if" +%token TK_THEN "then" +%token TK_ELSE "else" +%token TK_ENDIF "endif" +%token TK_FOR "for" +%token TK_TO "to" +%token TK_NEXT "next" +%token TK_WHILE "while" +%token TK_WEND "wend" +%token TK_END "end" +%token TK_RAND "rand" +%token TK_PRINT "print" + +%type <expr> expr +%type <expr> comp_expr +%type <expr> value +%type <assign> assign +%type <args> args + +%destructor { delete $$; } "identifier" + +%destructor { delete $$; } args +%destructor { delete $$; } assign +%destructor { delete $$; } value +%destructor { delete $$; } expr +%destructor { delete $$; } comp_expr + +%left '+' '-'; +%left '*' '/' '%'; +%left NEG; +%% +%start unit; + +unit : states + | unit states + ; + +states : statement "\n" + | "\n" + ; + +statement : "end" { driver.EndStatement(@1); } + | assign { driver.AssignStatement(@1, $1); } + | "if" comp_expr "then" { driver.IfStatement(@1, $2); } + | "else" { driver.ElseStatement(@1); } + | "endif" { driver.EndifStatement(@1); } + | "for" assign "to" expr "step" expr { driver.ForStatement(@1, $2, $4, $6); } + | "for" assign "to" expr { driver.ForStatement(@1, $2, $4, NULL); } + | "next" { driver.NextStatement(@1); } + | "while" comp_expr { driver.WhileStatement(@1, $2); } + | "wend" { driver.WendStatement(@1); } + | "print" args { driver.PrintStatement(@1, $2); } + | error /* G[̏ꍇ */ + ; + +assign : value '=' expr { $$ = new CAssign(@1, '=', $1, $3); } + ; + +comp_expr : expr "==" expr { $$ = CNode::MakeNode(driver, @1, OP_EQ, $1, $3); } + | expr "!=" expr { $$ = CNode::MakeNode(driver, @1, OP_NE, $1, $3); } + | expr '>' expr { $$ = CNode::MakeNode(driver, @1, OP_GT, $1, $3); } + | expr ">=" expr { $$ = CNode::MakeNode(driver, @1, OP_GE, $1, $3); } + | expr '<' expr { $$ = CNode::MakeNode(driver, @1, OP_LT, $1, $3); } + | expr "<=" expr { $$ = CNode::MakeNode(driver, @1, OP_LE, $1, $3); } + ; + +expr : expr '-' expr { $$ = CNode::MakeNode(driver, @1, OP_MINUS, $1, $3); } + | expr '+' expr { $$ = CNode::MakeNode(driver, @1, OP_PLUS, $1, $3); } + | expr '*' expr { $$ = CNode::MakeNode(driver, @1, OP_TIMES, $1, $3); } + | expr '/' expr { $$ = CNode::MakeNode(driver, @1, OP_DIVIDE, $1, $3); } + | expr '%' expr { $$ = CNode::MakeNode(driver, @1, OP_MOD, $1, $3); } + | '-' expr %prec NEG { $$ = CNode::MakeNode(driver, @1, OP_NEG, $2); } + | '(' expr ')' { $$ = $2; } + | value { $$ = $1; } + | "ival" { $$ = new CNode(@1, OP_CONST, $1); } + | "rand" '(' expr ')' { $$ = new CNode(@1, OP_RANDFUNC, $3); } + ; + +value : "identifier" { $$ = new CValueNode(@1, $1); } + ; + +args : expr { $$ = new CArgs(@1, $1); } + | args ',' expr { $$ = $1->Add(@3, $3); } + ; + +%% +void yy::script_parser::error(const yy::script_parser::location_type& l, const std::string& m) +{ + driver.error(l, m); +}