diff --git a/src/compile/mod.rs b/src/compile/mod.rs index 78bd5be..6aa61ff 100644 --- a/src/compile/mod.rs +++ b/src/compile/mod.rs @@ -332,20 +332,28 @@ fn compile_name_multi_statement(mut env: &mut Env, idents: &[parse::Identifier]) res } -fn compile_rvalue_noqi2(mut env: &mut Env, rv: &parse::RvalueNoQi2, paren_when_casted : bool) -> String { +fn compile_rvalue_noqi2( + mut env: &mut Env, + rv: &parse::RvalueNoQi2, + paren_when_casted: bool, +) -> String { match rv { parse::RvalueNoQi2::Simple(d) => { compile_dataorqi2(&mut env, &parse::DataOrQi2::Data(d.clone())) } - parse::RvalueNoQi2::Length(d) => if paren_when_casted {format!( - "({}.len() as f64)", - compile_dataorqi2(&mut env, &parse::DataOrQi2::Data(d.clone())) - )} else { - format!( - "{}.len() as f64", - compile_dataorqi2(&mut env, &parse::DataOrQi2::Data(d.clone())) - ) - }, + parse::RvalueNoQi2::Length(d) => { + if paren_when_casted { + format!( + "({}.len() as f64)", + compile_dataorqi2(&mut env, &parse::DataOrQi2::Data(d.clone())) + ) + } else { + format!( + "{}.len() as f64", + compile_dataorqi2(&mut env, &parse::DataOrQi2::Data(d.clone())) + ) + } + } parse::RvalueNoQi2::Index(d, ind) => format!( "{}[{} - 1]", compile_dataorqi2(&mut env, &parse::DataOrQi2::Data(d.clone())), @@ -493,6 +501,14 @@ fn compile_statement(mut env: &mut Env, st: &parse::Statement) -> Vec { vec![] } parse::Statement::Math { math } => compile_math(&mut env, math), + parse::Statement::ReferenceWhatIsLeft { data } => vec![( + env.indent_level, + format!( + "let _ans{} = &{}[1..].to_vec();", + get_new_unnamed_var(&mut env), + compile_dataorqi2(&mut env, &parse::DataOrQi2::Data(data.clone())) + ), + )], parse::Statement::Declare(parse::DeclareStatement { how_many_variables, type_, diff --git a/src/identbimap/mod.rs b/src/identbimap/mod.rs index a060e80..651094c 100644 --- a/src/identbimap/mod.rs +++ b/src/identbimap/mod.rs @@ -138,6 +138,9 @@ impl IdentBiMap { } fn insert_stmt(&mut self, st: &parse::Statement, conversion_table: &Table) { match st { + parse::Statement::ReferenceWhatIsLeft { data } => { + self.insert_dat(&data, &conversion_table); + } parse::Statement::ForArr { list, elem, stmts } => { self.insert_ident(&list, &conversion_table); self.insert_ident(&elem, &conversion_table); diff --git a/src/parse/mod.rs b/src/parse/mod.rs index cd1f539..8195f79 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -71,6 +71,9 @@ pub enum Statement { Reference { rvalue: RvalueNoQi2, }, + ReferenceWhatIsLeft { + data: Data, + }, ArrayFill { what_to_fill: IdentOrQi2, elems: Vec, @@ -470,7 +473,7 @@ fn parse_reference_statement_after_fu2(mut iter: &mut LexIter<'_>) -> Result Ok(Statement::Reference { rvalue: RvalueNoQi2::Index(data, interpret_intnum(&index)), }), - lex::Lex::Qi2Yu2 => unimplemented!("夫 data 之 其餘"), + lex::Lex::Qi2Yu2 => Ok(Statement::ReferenceWhatIsLeft { data }), lex::Lex::Identifier(ident) => Ok(Statement::Reference { rvalue: RvalueNoQi2::IndexByIdent(data, Identifier(ident.clone())), }), diff --git a/src/tests/mod.rs b/src/tests/mod.rs index 219d0b8..24eeae9 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -354,3 +354,7 @@ fn test078() { fn test079() { test("test079") } +#[test] +fn test080() { + test("test080") +} diff --git a/test080.rs b/test080.rs new file mode 100644 index 0000000..d79ce03 --- /dev/null +++ b/test080.rs @@ -0,0 +1,7 @@ +fn main() { + let mut JIA3 = vec![]; + JIA3.push(3.0); + JIA3.push(5.0); + let _ans1 = &JIA3[1..].to_vec(); + let YI3 = _ans1; +} diff --git a/test080.wy b/test080.wy new file mode 100644 index 0000000..6df7479 --- /dev/null +++ b/test080.wy @@ -0,0 +1,4 @@ +吾有一列。名之曰「甲」。充「甲」以三。充「甲」以五。 + +夫「甲」之其餘。名之曰「乙」。 +