11use crate :: identbimap;
22use crate :: lex;
33use crate :: parse;
4+ use big_s:: S ;
45
56type Line = ( usize , String ) ;
67
@@ -19,19 +20,19 @@ fn compile_optional_literal(
1920) -> String {
2021 match lit {
2122 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" ) ,
2627 } ,
2728 Some ( v) => compile_literal ( & env, v) ,
2829 }
2930}
3031
3132fn compile_literal ( env : & Env , v : & parse:: Data ) -> String {
3233 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" ) ,
3536 parse:: Data :: Identifier ( ident) => env. ident_map . translate_from_hanzi ( & ident) ,
3637 parse:: Data :: IntNum ( intnum) => format ! ( "{}.0" , intnum) ,
3738 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])
126127 r. append ( & mut compile_statement ( & mut env, & st) ) ;
127128 }
128129 env. indent_level -= 1 ;
129- r. push ( ( env. indent_level , "}" . to_string ( ) ) ) ;
130+ r. push ( ( env. indent_level , S ( "}" ) ) ) ;
130131 r
131132}
132133
@@ -136,7 +137,7 @@ fn compile_dataorqi2(env: &mut Env, a: &parse::OrQi2<parse::Data>) -> String {
136137 let qi = env
137138 . variables_not_yet_named
138139 . last ( )
139- . unwrap_or ( & "f64::NAN" . to_string ( ) )
140+ . unwrap_or ( & S ( "f64::NAN" ) )
140141 . to_string ( ) ;
141142
142143 //《文言陰符》曰『言「其」者。取至近之魚而棄其餘。』
@@ -384,10 +385,10 @@ fn compile_if(
384385 }
385386
386387 if !elsecase. is_empty ( ) {
387- r. push ( ( env. indent_level , "} else {" . to_string ( ) ) ) ;
388+ r. push ( ( env. indent_level , S ( "} else {" ) ) ) ;
388389 compile_indent ( & mut env, & mut r, & elsecase)
389390 }
390- r. push ( ( env. indent_level , "}" . to_string ( ) ) ) ;
391+ r. push ( ( env. indent_level , S ( "}" ) ) ) ;
391392 r
392393}
393394
@@ -416,8 +417,8 @@ fn compile_statement(mut env: &mut Env, st: &parse::Statement) -> Vec<Line> {
416417 . join( ", " )
417418 ) ,
418419 ) ] ,
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;" ) ) ] ,
421422 parse:: Statement :: ArrayFill {
422423 what_to_fill : parse:: OrQi2 :: NotQi2 ( ident) ,
423424 elems,
@@ -540,7 +541,7 @@ fn compile_statement(mut env: &mut Env, st: &parse::Statement) -> Vec<Line> {
540541 ) ,
541542 ) ] ;
542543 compile_indent ( & mut env, & mut r, & stmts) ;
543- r. push ( ( env. indent_level , "}" . to_string ( ) ) ) ;
544+ r. push ( ( env. indent_level , S ( "}" ) ) ) ;
544545 r
545546 }
546547 parse:: Statement :: Loop { statements } => compile_loop ( & mut env, statements) ,
@@ -617,21 +618,21 @@ fn compile_forenum_ident(
617618 compile_indent ( & mut env, & mut r, statements) ;
618619 r. append ( & mut vec ! [
619620 ( env. indent_level + 1 , format!( "_rand{} += 1.0;" , rand_n, ) ) ,
620- ( env. indent_level, "}" . to_string ( ) ) ,
621+ ( env. indent_level, S ( "}" ) ) ,
621622 ] ) ;
622623 r
623624}
624625
625626fn 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 {" ) ) ] ;
627628 compile_indent ( & mut env, & mut r, statements) ;
628- r. push ( ( env. indent_level , "}" . to_string ( ) ) ) ;
629+ r. push ( ( env. indent_level , S ( "}" ) ) ) ;
629630 r
630631}
631632
632633use std:: collections:: HashMap ;
633634pub 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() {" ) ) ] ;
635636 let mut env = Env {
636637 ans_counter : 0 ,
637638 rand_counter : 0 ,
@@ -644,7 +645,7 @@ pub fn compile(parsed: &[parse::Statement], conversion_table: &HashMap<String, S
644645 ans. append ( & mut compile_statement ( & mut env, & st) ) ;
645646 }
646647
647- ans. push ( ( 0 , "}" . to_string ( ) ) ) ;
648+ ans. push ( ( 0 , S ( "}" ) ) ) ;
648649
649650 ans. iter ( )
650651 . map ( |( indent, src) | format ! ( "{}{}\n " , " " . repeat( * indent) , src) )
0 commit comments