-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathGD_test2.php
More file actions
237 lines (196 loc) · 5.22 KB
/
GD_test2.php
File metadata and controls
237 lines (196 loc) · 5.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
<HTML>
<HEAD>
<TITLE>Processing パーサのテストページ</TITLE>
</HEAD>
<BODY>
<?php
// エラー出力する場合
ini_set( 'display_errors', 1 );
include_once "iProgToken.php";
include_once 'iProgParse.php';
include_once 'iProgEval.php';
function getTokenErrors($tl) {
$message = "";
foreach($tl->tokenList as $token) {
if($token->isError()) {
switch($token->type) {
case IProgToken::UNKNOWN: $message .= "Unknown error". atLinePos($token) . "<br>\n"; break;
case IProgToken::INVALID_CHARACTER:
$message .= sprintf("Ivalid character '%s' ",$token->value) . atLinePos($token) . "<br>\n"; break;
case IProgToken::UNTERMINATED_STRING:
$message .= sprintf("Unterminated string %s ",$token->value) . atLinePos($token) . "<br>\n"; break;
case IProgToken::UNTERMINATED_CHARACTER:
$message .= sprintf("Unterminated character %s ",$token->value) . atLinePos($token) . "<br>\n"; break;
case IProgToken::UNTERMINATED_COMMENT:
$message .= sprintf("Unterminated comment '%s' ",$token->value) . atLinePos($token) . "<br>\n"; break;
default:
}
}
}
return $message;
}
if(isset($_POST['text'])) {
$text = $_POST['text'];
$view = htmlspecialchars($text);
print <<<END
<hr>
次のテキストを構文解析します。
<pre>
$view
</pre>
<hr>
構文解析結果<br>
END;
$tl = new TokenList($text);
if(!$tl->tokenList) {
printf("字句解析に失敗しました。たぶん入力が空か、ascii文字以外が使われています。<br>");
goto next;
}
$message = $tl->getTokenErrors();
if(strlen($message)>0) {
print "$message<hr>\n";
goto next;
}
$tl->removeComment();
$result = parseStatement($tl->tokenList);
$parse = $result[0];
if(!$parse) {
printf("構文エラーがありました。<br>");
print("<pre>\n");
print_r($tl);;
print("</pre>\n");
goto next;
}
if($parse->isError()) {
printf("構文エラーがありました。<br>%s<br>", $parse->message);
goto next;
}
print "<pre>\n";
//printResult($parse);
GD_Draw($parse);
/// print_r($parse);
print "</pre>\n";
print "<hr>\n";
}
next: 1;
?>
構文解析したいjava/processingソースを以下に入力してください。ただし現在は
<ul>
<li> 以下の単文のみ対応しています。
<pre>
式;
; (空文)
</pre>
<li> 式は結構頑張ってますが、まだまだ不完全です。型のチェック、キャストはできていません。
</ul>
<form action="GD_test2.php" method="post">
入力: <textarea name=text></textarea><p>
<input type="submit" value="実行" />
</form>
<?php
if(isset($_POST['text2']) && $_POST['text2']) {
$text = $_POST['text2'];
$view = htmlspecialchars($text);
$vari = $_POST['text4'];
$view3 = htmlspecialchars($vari);
$coll = $_POST['text3'];
$view2 = htmlspecialchars($coll);
print <<<END
<hr>
次の式を評価します。
<pre>
変数: $view3
正解: $view2
入力: $view
</pre>
<hr>
結果<br>
END;
$tl = new TokenList($text);
$message = $tl->getTokenErrors();
if(strlen($message)>0) {
print $message;
print "<hr>\n";
goto next2;
}
$tl->removeComment();
$result = parseExpression($tl->tokenList);
$parse = $result[0];
if(!$tl->tokenList) {
printf("字句解析に失敗しました。たぶん入力が空か、ascii文字以外が使われています。<br>");
goto next2;
}
if(!$parse) {
printf("構文エラーがありました。<br>");
print("<pre>\n");
print_r($tl);;
print("</pre>\n");
goto next2;
}
if($parse->isError()) {
printf("構文エラーがありました。<br>%s<br>", $parse->message);
goto next2;
}
// ここに変数宣言
if($vari) {
$vl = new TokenList($vari);
// print "<pre>\n"; print_r($vl); print "</pre>\n";
$message = $vl->getTokenErrors();
if(strlen($message)>0) {
print $message;
print "<hr>\n";
goto next2;
}
$vl->removeComment();
$v_result = parseVariableDeclaration($vl->tokenList);
print "<pre>\n"; print_r($v_result); print "</pre>\n";
}
// kore tanjunnni test you
$fl = getMethodResultByStrings($coll);
if($parse->type == IProgParse::METHOD_EXPRESSION) {
$val = iProgEvalGetMethodResult($parse);
} else {
$val = iProgEval($parse);
}
if(! isset($val)) {
printf("評価できません。");
goto next2;
}
print "<pre>\n";
if($val instanceof MethodResult) {
if(count($fl) <= 0) {
print("メソッド評価時には正解も入力してください。");
goto next2;
}
$eMess = "";
while($fl) {
$fn = array_shift($fl);
if($fn->equal($val)) {
print("一致しました。<br>\n");
$eMess = null;
break;
} else {
$eMess .= "$iProgError\n";
}
}
if(isset($eMess)) {
print("<pre>\n$eMess\n</pre>\n");
}
} else {
switch($val->type) {
case EResult::INTEGER:
printf("整数値:%d\n",$val->value);
break;
case EResult::FLOAT:
printf("実数値:%f\n",$val->value);
break;
case EResult::ERROR:
printf("エラーが発生しました:%s\n",$val->value);
break;
}
}
//*/
print "<hr>\n";
}
next2: 1;
?>