1
1
use crate :: identbimap;
2
2
use crate :: lex;
3
3
use crate :: parse;
4
+ use big_s:: S ;
4
5
5
6
type Line = ( usize , String ) ;
6
7
@@ -19,19 +20,19 @@ fn compile_optional_literal(
19
20
) -> String {
20
21
match lit {
21
22
None => match default_type {
22
- lex:: Type :: Shu4 => "0.0" . to_string ( ) ,
23
- lex:: Type :: Lie4 => "vec![]" . to_string ( ) ,
24
- lex:: Type :: Yan2 => "\" \" " . to_string ( ) ,
25
- lex:: Type :: Yao2 => "false" . to_string ( ) ,
23
+ lex:: Type :: Shu4 => S ( "0.0" ) ,
24
+ lex:: Type :: Lie4 => S ( "vec![]" ) ,
25
+ lex:: Type :: Yan2 => S ( "\" \" " ) ,
26
+ lex:: Type :: Yao2 => S ( "false" ) ,
26
27
} ,
27
28
Some ( v) => compile_literal ( & env, v) ,
28
29
}
29
30
}
30
31
31
32
fn compile_literal ( env : & Env , v : & parse:: Data ) -> String {
32
33
match v. clone ( ) {
33
- parse:: Data :: BoolValue ( true ) => "true" . to_string ( ) ,
34
- parse:: Data :: BoolValue ( false ) => "false" . to_string ( ) ,
34
+ parse:: Data :: BoolValue ( true ) => S ( "true" ) ,
35
+ parse:: Data :: BoolValue ( false ) => S ( "false" ) ,
35
36
parse:: Data :: Identifier ( ident) => env. ident_map . translate_from_hanzi ( & ident) ,
36
37
parse:: Data :: IntNum ( intnum) => format ! ( "{}.0" , intnum) ,
37
38
parse:: Data :: StringLiteral ( strlit) => format ! ( "\" {}\" " , strlit) , // FIXME properly escape
@@ -126,7 +127,7 @@ fn compile_forenum(mut env: &mut Env, num: i64, statements: &[parse::Statement])
126
127
r. append ( & mut compile_statement ( & mut env, & st) ) ;
127
128
}
128
129
env. indent_level -= 1 ;
129
- r. push ( ( env. indent_level , "}" . to_string ( ) ) ) ;
130
+ r. push ( ( env. indent_level , S ( "}" ) ) ) ;
130
131
r
131
132
}
132
133
@@ -136,7 +137,7 @@ fn compile_dataorqi2(env: &mut Env, a: &parse::OrQi2<parse::Data>) -> String {
136
137
let qi = env
137
138
. variables_not_yet_named
138
139
. last ( )
139
- . unwrap_or ( & "f64::NAN" . to_string ( ) )
140
+ . unwrap_or ( & S ( "f64::NAN" ) )
140
141
. to_string ( ) ;
141
142
142
143
//《文言陰符》曰『言「其」者。取至近之魚而棄其餘。』
@@ -384,10 +385,10 @@ fn compile_if(
384
385
}
385
386
386
387
if !elsecase. is_empty ( ) {
387
- r. push ( ( env. indent_level , "} else {" . to_string ( ) ) ) ;
388
+ r. push ( ( env. indent_level , S ( "} else {" ) ) ) ;
388
389
compile_indent ( & mut env, & mut r, & elsecase)
389
390
}
390
- r. push ( ( env. indent_level , "}" . to_string ( ) ) ) ;
391
+ r. push ( ( env. indent_level , S ( "}" ) ) ) ;
391
392
r
392
393
}
393
394
@@ -416,8 +417,8 @@ fn compile_statement(mut env: &mut Env, st: &parse::Statement) -> Vec<Line> {
416
417
. join( ", " )
417
418
) ,
418
419
) ] ,
419
- parse:: Statement :: Continue => vec ! [ ( env. indent_level, "continue;" . to_string ( ) ) ] ,
420
- parse:: Statement :: Break => vec ! [ ( env. indent_level, "break;" . to_string ( ) ) ] ,
420
+ parse:: Statement :: Continue => vec ! [ ( env. indent_level, S ( "continue;" ) ) ] ,
421
+ parse:: Statement :: Break => vec ! [ ( env. indent_level, S ( "break;" ) ) ] ,
421
422
parse:: Statement :: ArrayFill {
422
423
what_to_fill : parse:: OrQi2 :: NotQi2 ( ident) ,
423
424
elems,
@@ -540,7 +541,7 @@ fn compile_statement(mut env: &mut Env, st: &parse::Statement) -> Vec<Line> {
540
541
) ,
541
542
) ] ;
542
543
compile_indent ( & mut env, & mut r, & stmts) ;
543
- r. push ( ( env. indent_level , "}" . to_string ( ) ) ) ;
544
+ r. push ( ( env. indent_level , S ( "}" ) ) ) ;
544
545
r
545
546
}
546
547
parse:: Statement :: Loop { statements } => compile_loop ( & mut env, statements) ,
@@ -617,21 +618,21 @@ fn compile_forenum_ident(
617
618
compile_indent ( & mut env, & mut r, statements) ;
618
619
r. append ( & mut vec ! [
619
620
( env. indent_level + 1 , format!( "_rand{} += 1.0;" , rand_n, ) ) ,
620
- ( env. indent_level, "}" . to_string ( ) ) ,
621
+ ( env. indent_level, S ( "}" ) ) ,
621
622
] ) ;
622
623
r
623
624
}
624
625
625
626
fn compile_loop ( mut env : & mut Env , statements : & [ parse:: Statement ] ) -> Vec < Line > {
626
- let mut r = vec ! [ ( env. indent_level, "loop {" . to_string ( ) ) ] ;
627
+ let mut r = vec ! [ ( env. indent_level, S ( "loop {" ) ) ] ;
627
628
compile_indent ( & mut env, & mut r, statements) ;
628
- r. push ( ( env. indent_level , "}" . to_string ( ) ) ) ;
629
+ r. push ( ( env. indent_level , S ( "}" ) ) ) ;
629
630
r
630
631
}
631
632
632
633
use std:: collections:: HashMap ;
633
634
pub fn compile ( parsed : & [ parse:: Statement ] , conversion_table : & HashMap < String , String > ) -> String {
634
- let mut ans = vec ! [ ( 0 , "fn main() {" . to_string ( ) ) ] ;
635
+ let mut ans = vec ! [ ( 0 , S ( "fn main() {" ) ) ] ;
635
636
let mut env = Env {
636
637
ans_counter : 0 ,
637
638
rand_counter : 0 ,
@@ -644,7 +645,7 @@ pub fn compile(parsed: &[parse::Statement], conversion_table: &HashMap<String, S
644
645
ans. append ( & mut compile_statement ( & mut env, & st) ) ;
645
646
}
646
647
647
- ans. push ( ( 0 , "}" . to_string ( ) ) ) ;
648
+ ans. push ( ( 0 , S ( "}" ) ) ) ;
648
649
649
650
ans. iter ( )
650
651
. map ( |( indent, src) | format ! ( "{}{}\n " , " " . repeat( * indent) , src) )
0 commit comments