@@ -178,7 +178,7 @@ impl Executor {
178
178
}
179
179
}
180
180
181
- /// メモリを表示
181
+ /// メモリの変数を表示
182
182
fn show_variables ( & mut self ) {
183
183
self . log_print ( format ! (
184
184
"メモリ内部の変数 {{ {} }}\n " ,
@@ -191,6 +191,7 @@ impl Executor {
191
191
) ) ;
192
192
}
193
193
194
+ // スタック内部を表示
194
195
fn show_stack ( & mut self ) {
195
196
self . log_print ( format ! (
196
197
"Stack〔 {} 〕" ,
@@ -204,6 +205,7 @@ impl Executor {
204
205
205
206
/// 構文解析
206
207
fn analyze_syntax ( & mut self , code : String ) -> Vec < String > {
208
+ // タブや改行・全角スペースを半角スペースに変換する
207
209
let code = code. replace ( [ '\n' , '\t' , '\r' , ' ' ] , " " ) ;
208
210
209
211
let mut syntax = Vec :: new ( ) ;
@@ -258,37 +260,29 @@ impl Executor {
258
260
259
261
/// プログラムを評価する
260
262
fn evaluate_program ( & mut self , code : String ) {
261
- // トークンを整える
263
+ // 構文解析してトークン列にする
262
264
let syntax: Vec < String > = self . analyze_syntax ( code) ;
263
265
264
266
for token in syntax {
265
- // スタック内部を表示する
266
- self . show_stack ( ) ;
267
+ self . show_stack ( ) ; // スタック内部を表示する
267
268
self . log_print ( format ! ( " ← {}\n " , token) ) ;
268
269
269
- // 数値に変換できたらスタックに積む
270
+ // 加工用の文字ベクタ
271
+ let chars: Vec < char > = token. chars ( ) . collect ( ) ;
272
+
270
273
if let Ok ( i) = token. parse :: < f64 > ( ) {
274
+ // 数値に変換できたらスタックに積む
271
275
self . stack . push ( Type :: Number ( i) ) ;
272
- continue ;
273
- }
274
-
275
- // 論理値をスタックに積む
276
- if token == "true" || token == "false" {
276
+ } else if token == "true" || token == "false" {
277
+ // 論理値をスタックに積む
277
278
self . stack . push ( Type :: Bool ( token. parse ( ) . unwrap_or ( true ) ) ) ;
278
- continue ;
279
- }
280
-
281
- // 文字列をスタックに積む
282
- let chars: Vec < char > = token. chars ( ) . collect ( ) ;
283
- if chars[ 0 ] == '(' && chars[ chars. len ( ) - 1 ] == ')' {
279
+ } else if chars[ 0 ] == '(' && chars[ chars. len ( ) - 1 ] == ')' {
280
+ // 文字列をスタックに積む
284
281
self . stack
285
282
. push ( Type :: String ( token[ 1 ..token. len ( ) - 1 ] . to_string ( ) ) ) ;
286
- continue ;
287
- }
288
-
289
- // リストを処理
290
- if chars[ 0 ] == '[' && chars[ chars. len ( ) - 1 ] == ']' {
291
- let old_len = self . stack . len ( ) ;
283
+ } else if chars[ 0 ] == '[' && chars[ chars. len ( ) - 1 ] == ']' {
284
+ // リストをスタックに積む
285
+ let old_len = self . stack . len ( ) ; // 本来のスタックの大きさ
292
286
let slice = & token[ 1 ..token. len ( ) - 1 ] ;
293
287
let token: Vec < _ > = slice. split_whitespace ( ) . map ( |x| x. to_string ( ) ) . collect ( ) ;
294
288
self . evaluate_program (
@@ -298,29 +292,23 @@ impl Executor {
298
292
. collect :: < Vec < _ > > ( )
299
293
. join ( " " ) ,
300
294
) ;
295
+ // スタックの増加分をリストの要素にする
301
296
let mut list = Vec :: new ( ) ;
302
297
for _ in old_len..self . stack . len ( ) {
303
298
list. push ( self . pop_stack ( ) ) ;
304
299
}
305
- list. reverse ( ) ;
300
+ list. reverse ( ) ; // スタックから取り出したのは逆なので反転させる
306
301
self . stack . push ( Type :: List ( list) ) ;
307
- continue ;
308
- }
309
-
310
- // 変数を読み込む
311
- if let Some ( i) = self . memory . get ( & token) {
302
+ } else if let Some ( i) = self . memory . get ( & token) {
303
+ // 変数を読み込む
312
304
self . stack . push ( i. clone ( ) ) ;
313
- continue ;
314
- }
315
-
316
- // コメントを処理
317
- if token. contains ( '#' ) {
305
+ } else if token. contains ( '#' ) {
306
+ // コメントを処理
318
307
self . log_print ( format ! ( "※ コメント「{}」\n " , token. replace( '#' , "" ) ) ) ;
319
- continue ;
308
+ } else {
309
+ // コマンドを実行する
310
+ self . execute_command ( token) ;
320
311
}
321
-
322
- // コマンドを実行する
323
- self . execute_command ( token) ;
324
312
}
325
313
326
314
// 実行後のスタックを表示
0 commit comments