|
6 | 6 |
|
7 | 7 | use super::ast; |
8 | 8 | use super::lexer; |
| 9 | +use super::parser; |
9 | 10 | use std::iter::FromIterator; |
10 | 11 | use num_bigint::BigInt; |
11 | 12 |
|
@@ -789,7 +790,8 @@ SliceOp: ast::Expression = { |
789 | 790 | } |
790 | 791 |
|
791 | 792 | Atom: ast::Expression = { |
792 | | - StringConstant, |
| 793 | + <s:StringGroup> => ast::Expression::String { value: s }, |
| 794 | + <b:Bytes> => ast::Expression::Bytes { value: b }, |
793 | 795 | <n:Number> => ast::Expression::Number { value: n }, |
794 | 796 | <i:Identifier> => ast::Expression::Identifier { name: i }, |
795 | 797 | "[" <e:TestListComp?> "]" => { |
@@ -992,16 +994,30 @@ Number: ast::Number = { |
992 | 994 | <s:complex> => { ast::Number::Complex { real: s.0, imag: s.1 } }, |
993 | 995 | }; |
994 | 996 |
|
995 | | -StringConstant: ast::Expression = { |
996 | | - <s:string+> => { |
997 | | - let glued = s.join(""); |
998 | | - ast::Expression::String { value: glued } |
| 997 | +StringGroup: ast::StringGroup = { |
| 998 | + <s:string+> =>? { |
| 999 | + let mut values = vec![]; |
| 1000 | + for (value, is_fstring) in s { |
| 1001 | + values.push(if is_fstring { |
| 1002 | + parser::parse_fstring(&value)? |
| 1003 | + } else { |
| 1004 | + ast::StringGroup::Constant { value } |
| 1005 | + }) |
| 1006 | + } |
| 1007 | + |
| 1008 | + Ok(if values.len() > 1 { |
| 1009 | + ast::StringGroup::Joined { values } |
| 1010 | + } else { |
| 1011 | + values.into_iter().next().unwrap() |
| 1012 | + }) |
999 | 1013 | }, |
| 1014 | +}; |
| 1015 | + |
| 1016 | +Bytes: Vec<u8> = { |
1000 | 1017 | <s:bytes+> => { |
1001 | | - let glued = s.into_iter().flatten().collect::<Vec<u8>>(); |
1002 | | - ast::Expression::Bytes { value: glued } |
| 1018 | + s.into_iter().flatten().collect::<Vec<u8>>() |
1003 | 1019 | }, |
1004 | | -}; |
| 1020 | +} |
1005 | 1021 |
|
1006 | 1022 | Identifier: String = <s:name> => s; |
1007 | 1023 |
|
@@ -1096,7 +1112,7 @@ extern { |
1096 | 1112 | int => lexer::Tok::Int { value: <BigInt> }, |
1097 | 1113 | float => lexer::Tok::Float { value: <f64> }, |
1098 | 1114 | complex => lexer::Tok::Complex { real: <f64>, imag: <f64> }, |
1099 | | - string => lexer::Tok::String { value: <String> }, |
| 1115 | + string => lexer::Tok::String { value: <String>, is_fstring: <bool> }, |
1100 | 1116 | bytes => lexer::Tok::Bytes { value: <Vec<u8>> }, |
1101 | 1117 | name => lexer::Tok::Name { name: <String> }, |
1102 | 1118 | "\n" => lexer::Tok::Newline, |
|
0 commit comments