annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
1 %skeleton "lalr1.cc"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
2 %define "parser_class_name" "script_parser"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
3 %defines
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
4 %{
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
5 #ifdef _MSC_VER
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
6 #pragma warning(disable: 4800)
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
7 #pragma warning(disable: 4267)
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
8 #endif
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
9
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
10 #include <string>
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
11 #include "node.h"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
12 class compiler;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
13 %}
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
14 // The parsing context.
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
15 %parse-param { compiler& driver }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
16 %lex-param { compiler& driver }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
17 %locations
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
18 //%expect 7
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
19 %initial-action
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
20 {
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
21 // ロケーション初期化
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
22 @$.begin.filename = @$.end.filename = &driver.get_filename();
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
23 };
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
24 // %debug
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
25 %error-verbose
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
26 // Symbols.
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
27 %union
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
28 {
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
29 int ival;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
30 std::string *sval;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
31
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
32 CArgs *args;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
33 CNode *expr;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
34 CAssign *assign;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
35 }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
36 %{
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
37 #include "compiler.h"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
38 %}
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
39
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
40 %token END_OF_FILE 0 "end of file"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
41 %token <ival> TK_IVAL "ival"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
42 %token <sval> TK_IDENTIFIER "identifier"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
43 %token TK_EQ "=="
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
44 %token TK_NE "!="
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
45 %token TK_GE ">="
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
46 %token TK_LE "<="
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
47 %token TK_NEWLINE "\n"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
48
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
49 %token TK_IF "if"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
50 %token TK_THEN "then"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
51 %token TK_ELSE "else"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
52 %token TK_ENDIF "endif"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
53 %token TK_FOR "for"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
54 %token TK_TO "to"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
55 %token TK_NEXT "next"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
56 %token TK_WHILE "while"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
57 %token TK_WEND "wend"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
58 %token TK_END "end"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
59 %token TK_RAND "rand"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
60 %token TK_PRINT "print"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
61
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
62 %type <expr> expr
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
63 %type <expr> comp_expr
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
64 %type <expr> value
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
65 %type <assign> assign
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
66 %type <args> args
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
67
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
68 %destructor { delete $$; } "identifier"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
69
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
70 %destructor { delete $$; } args
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
71 %destructor { delete $$; } assign
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
72 %destructor { delete $$; } value
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
73 %destructor { delete $$; } expr
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
74 %destructor { delete $$; } comp_expr
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
75
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
76 %left '+' '-';
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
77 %left '*' '/' '%';
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
78 %left NEG;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
79 %%
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
80 %start unit;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
81
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
82 unit : states
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
83 | unit states
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
84 ;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
85
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
86 states : statement "\n"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
87 | "\n"
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
88 ;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
89
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
90 statement : "end" { driver.EndStatement(@1); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
91 | assign { driver.AssignStatement(@1, $1); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
92 | "if" comp_expr "then" { driver.IfStatement(@1, $2); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
93 | "else" { driver.ElseStatement(@1); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
94 | "endif" { driver.EndifStatement(@1); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
95 | "for" assign "to" expr "step" expr { driver.ForStatement(@1, $2, $4, $6); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
96 | "for" assign "to" expr { driver.ForStatement(@1, $2, $4, NULL); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
97 | "next" { driver.NextStatement(@1); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
98 | "while" comp_expr { driver.WhileStatement(@1, $2); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
99 | "wend" { driver.WendStatement(@1); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
100 | "print" args { driver.PrintStatement(@1, $2); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
101 | error /* エラーの場合 */
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
102 ;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
103
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
104 assign : value '=' expr { $$ = new CAssign(@1, '=', $1, $3); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
105 ;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
106
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
107 comp_expr : expr "==" expr { $$ = CNode::MakeNode(driver, @1, OP_EQ, $1, $3); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
108 | expr "!=" expr { $$ = CNode::MakeNode(driver, @1, OP_NE, $1, $3); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
109 | expr '>' expr { $$ = CNode::MakeNode(driver, @1, OP_GT, $1, $3); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
110 | expr ">=" expr { $$ = CNode::MakeNode(driver, @1, OP_GE, $1, $3); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
111 | expr '<' expr { $$ = CNode::MakeNode(driver, @1, OP_LT, $1, $3); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
112 | expr "<=" expr { $$ = CNode::MakeNode(driver, @1, OP_LE, $1, $3); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
113 ;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
114
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
115 expr : expr '-' expr { $$ = CNode::MakeNode(driver, @1, OP_MINUS, $1, $3); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
116 | expr '+' expr { $$ = CNode::MakeNode(driver, @1, OP_PLUS, $1, $3); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
117 | expr '*' expr { $$ = CNode::MakeNode(driver, @1, OP_TIMES, $1, $3); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
118 | expr '/' expr { $$ = CNode::MakeNode(driver, @1, OP_DIVIDE, $1, $3); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
119 | expr '%' expr { $$ = CNode::MakeNode(driver, @1, OP_MOD, $1, $3); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
120 | '-' expr %prec NEG { $$ = CNode::MakeNode(driver, @1, OP_NEG, $2); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
121 | '(' expr ')' { $$ = $2; }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
122 | value { $$ = $1; }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
123 | "ival" { $$ = new CNode(@1, OP_CONST, $1); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
124 | "rand" '(' expr ')' { $$ = new CNode(@1, OP_RANDFUNC, $3); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
125 ;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
126
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
127 value : "identifier" { $$ = new CValueNode(@1, $1); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
128 ;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
129
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
130 args : expr { $$ = new CArgs(@1, $1); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
131 | args ',' expr { $$ = $1->Add(@3, $3); }
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
132 ;
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
133
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
134 %%
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
135 void yy::script_parser::error(const yy::script_parser::location_type& l, const std::string& m)
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
136 {
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
137 driver.error(l, m);
fbe42292d479 upload test
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
138 }