@@ -600,15 +600,16 @@ impl Compiler {
600
600
) )
601
601
}
602
602
Rule :: string => {
603
- let index = self . push_constant ( Constant :: String (
604
- escape_string_contents ( primary. as_str ( ) . trim_matches ( '"' ) )
605
- . map_err ( |e| pest_error_from_span ( primary. as_span ( ) , e) ) ?,
606
- ) ) ;
603
+ let span = primary. as_span ( ) ;
604
+ let string_line_col = primary. line_col ( ) ;
605
+ let str = escape_string_contents ( first_child ( primary) . as_str ( ) )
606
+ . map_err ( |e| pest_error_from_span ( span, e) ) ?;
607
+ let index = self . push_constant ( Constant :: String ( str) ) ;
607
608
Ok ( Expr :: new (
608
609
ExprKind :: String ,
609
610
Instructions :: from_instructions_and_line_col (
610
611
vec ! [ OpCode :: PushConstant ( index) ] ,
611
- primary . line_col ( ) ,
612
+ string_line_col ,
612
613
) ,
613
614
) )
614
615
}
@@ -1960,9 +1961,51 @@ mod test {
1960
1961
1961
1962
#[ test]
1962
1963
fn test_compile_string ( ) {
1964
+ let ( _, constants) = compile_expr ( r#""""# ) ;
1965
+ assert_eq ! ( constants, vec![ "" . into( ) ] ) ;
1966
+
1963
1967
let ( _, constants) = compile_expr ( r#""hello""# ) ;
1964
1968
assert_eq ! ( constants, vec![ "hello" . into( ) ] ) ;
1965
1969
1970
+ let ( _, constants) = compile_expr ( r#""\"""# ) ;
1971
+ assert_eq ! ( constants, vec![ Constant :: from( "\" " ) ] ) ;
1972
+
1973
+ let ( _, constants) = compile_expr ( r#""\/""# ) ;
1974
+ assert_eq ! ( constants, vec![ Constant :: from( "/" ) ] ) ;
1975
+
1976
+ let ( _, constants) = compile_expr ( r#""\a""# ) ;
1977
+ assert_eq ! ( constants, vec![ Constant :: from( "\x07 " ) ] ) ;
1978
+
1979
+ let ( _, constants) = compile_expr ( r#""\b""# ) ;
1980
+ assert_eq ! ( constants, vec![ Constant :: from( "\x08 " ) ] ) ;
1981
+
1982
+ let ( _, constants) = compile_expr ( r#""\f""# ) ;
1983
+ assert_eq ! ( constants, vec![ Constant :: from( "\x0C " ) ] ) ;
1984
+
1985
+ let ( _, constants) = compile_expr ( r#""\n""# ) ;
1986
+ assert_eq ! ( constants, vec![ Constant :: from( "\n " ) ] ) ;
1987
+
1988
+ let ( _, constants) = compile_expr ( r#""\r""# ) ;
1989
+ assert_eq ! ( constants, vec![ Constant :: from( "\r " ) ] ) ;
1990
+
1991
+ let ( _, constants) = compile_expr ( r#""\t""# ) ;
1992
+ assert_eq ! ( constants, vec![ Constant :: from( "\t " ) ] ) ;
1993
+
1994
+ let ( _, constants) = compile_expr ( r#""\v""# ) ;
1995
+ assert_eq ! ( constants, vec![ Constant :: from( "\x0B " ) ] ) ;
1996
+
1997
+ let ( _, constants) = compile_expr ( r#""\\""# ) ;
1998
+ assert_eq ! ( constants, vec![ Constant :: from( "\\ " ) ] ) ;
1999
+
2000
+ let ( _, constants) = compile_expr ( r#""\7""# ) ;
2001
+ assert_eq ! ( constants, vec![ Constant :: from( "\x07 " ) ] ) ;
2002
+
2003
+ let ( _, constants) = compile_expr ( r#""\41""# ) ;
2004
+ assert_eq ! ( constants, vec![ Constant :: from( "!" ) ] ) ;
2005
+
2006
+ let ( _, constants) = compile_expr ( r#""\142""# ) ;
2007
+ assert_eq ! ( constants, vec![ Constant :: from( "b" ) ] ) ;
2008
+
1966
2009
let ( _, constants) = compile_expr ( r#""hello\nworld""# ) ;
1967
2010
assert_eq ! ( constants, vec![ Constant :: from( "hello\n world" ) ] ) ;
1968
2011
@@ -1980,6 +2023,12 @@ mod test {
1980
2023
1981
2024
let ( _, constants) = compile_expr ( r#""hello\141world""# ) ;
1982
2025
assert_eq ! ( constants, vec![ Constant :: from( "helloaworld" ) ] ) ;
2026
+
2027
+ let ( _, constants) = compile_expr ( r#""\\""# ) ;
2028
+ assert_eq ! ( constants, vec![ Constant :: from( "\\ " ) ] ) ;
2029
+
2030
+ let ( _, constants) = compile_expr ( r#""\"""# ) ;
2031
+ assert_eq ! ( constants, vec![ Constant :: from( "\" " ) ] ) ;
1983
2032
}
1984
2033
1985
2034
#[ test]
0 commit comments