Skip to content

Commit

Permalink
Implement Qi2Yu2
Browse files Browse the repository at this point in the history
  • Loading branch information
sozysozbot committed Jul 24, 2020
1 parent 9b35834 commit aef1ebc
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 11 deletions.
36 changes: 26 additions & 10 deletions src/compile/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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())),
Expand Down Expand Up @@ -493,6 +501,14 @@ fn compile_statement(mut env: &mut Env, st: &parse::Statement) -> Vec<Line> {
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_,
Expand Down
3 changes: 3 additions & 0 deletions src/identbimap/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
5 changes: 4 additions & 1 deletion src/parse/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ pub enum Statement {
Reference {
rvalue: RvalueNoQi2,
},
ReferenceWhatIsLeft {
data: Data,
},
ArrayFill {
what_to_fill: IdentOrQi2,
elems: Vec<Data>,
Expand Down Expand Up @@ -470,7 +473,7 @@ fn parse_reference_statement_after_fu2(mut iter: &mut LexIter<'_>) -> Result<Sta
lex::Lex::IntNum(index) => 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())),
}),
Expand Down
4 changes: 4 additions & 0 deletions src/tests/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -354,3 +354,7 @@ fn test078() {
fn test079() {
test("test079")
}
#[test]
fn test080() {
test("test080")
}
7 changes: 7 additions & 0 deletions test080.rs
Original file line number Diff line number Diff line change
@@ -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;
}
4 changes: 4 additions & 0 deletions test080.wy
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
吾有一列。名之曰「甲」。充「甲」以三。充「甲」以五。

夫「甲」之其餘。名之曰「乙」。

0 comments on commit aef1ebc

Please sign in to comment.