Skip to content

Commit

Permalink
Refactor & fix a problem
Browse files Browse the repository at this point in the history
  • Loading branch information
sozysozbot committed Jul 24, 2020
1 parent dfb098e commit 15c36dd
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 26 deletions.
12 changes: 4 additions & 8 deletions src/compile/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -562,14 +562,10 @@ fn compile_lvalue(env: &Env, lvalue: &parse::Lvalue) -> String {

fn compile_rvalue(mut env: &mut Env, rvalue: &parse::Rvalue) -> String {
match rvalue {
parse::Rvalue {
data,
opt_index: Some(index),
} => format!("{}[{} - 1]", compile_dataorqi2(&mut env, data), index),
parse::Rvalue {
data,
opt_index: None,
} => format!("{}", compile_dataorqi2(&mut env, data)),
parse::Rvalue::Index(data, index) => {
format!("{}[{} - 1]", compile_dataorqi2(&mut env, data), index)
}
parse::Rvalue::Simple(data) => format!("{}", compile_dataorqi2(&mut env, data)),
}
}

Expand Down
26 changes: 19 additions & 7 deletions src/identbimap/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -193,19 +193,31 @@ impl IdentBiMap {
ident,
opt_index: None,
},
rvalue: parse::Rvalue { data, opt_index: _ },
} => {
self.insert_ident(&ident, &conversion_table);
self.mutable_idents.insert(ident.clone());
self.insert_data_or_qi2(data, &conversion_table);
rvalue: parse::Rvalue::Index(data, _),
}
parse::Statement::Assignment {
| parse::Statement::Assignment {
lvalue:
parse::Lvalue {
ident,
opt_index: None,
},
rvalue: parse::Rvalue::Simple(data),
}
| parse::Statement::Assignment {
lvalue:
parse::Lvalue {
ident,
opt_index: Some(_), // FIXME: need to consder this once the possibility of index being an identifier is added
},
rvalue: parse::Rvalue::Simple(data),
}
| parse::Statement::Assignment {
lvalue:
parse::Lvalue {
ident,
opt_index: Some(_), // FIXME: need to consder this once the possibility of index being an identifier is added
},
rvalue: parse::Rvalue { data, opt_index: _ },
rvalue: parse::Rvalue::Index(data, _),
} => {
self.insert_ident(&ident, &conversion_table);
self.mutable_idents.insert(ident.clone());
Expand Down
25 changes: 14 additions & 11 deletions src/parse/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ pub struct Lvalue {
}

#[derive(Debug)]
pub struct Rvalue {
pub data: DataOrQi2,
pub opt_index: Option<i64>,
pub enum Rvalue {
Simple(DataOrQi2),
Index(DataOrQi2, i64),
}

#[derive(Debug)]
Expand Down Expand Up @@ -358,7 +358,7 @@ fn parse_identifier(iter: &mut LexIter<'_>) -> Result<Identifier, Error> {
}
}

fn parse_assign_after_zhe3(mut iter: &mut LexIter<'_>) -> Result<(DataOrQi2, Option<i64>), Error> {
fn parse_assign_after_zhe3(mut iter: &mut LexIter<'_>) -> Result<Rvalue, Error> {
match iter.next().ok_or(Error::UnexpectedEOF)? {
lex::Lex::Jin1Bu4Fu4Cun2Yi3 => unimplemented!("昔之 ... 者今不復存矣"),
lex::Lex::Jin1 => {
Expand All @@ -368,7 +368,7 @@ fn parse_assign_after_zhe3(mut iter: &mut LexIter<'_>) -> Result<(DataOrQi2, Opt
match iter.next().ok_or(Error::UnexpectedEOF)? {
lex::Lex::IntNum(int_num) => {
if let lex::Lex::Shi4Yi3 = iter.next().ok_or(Error::UnexpectedEOF)? {
Ok((data, Some(interpret_intnum(int_num))))
Ok(Rvalue::Index(data, interpret_intnum(int_num)))
} else {
Err(Error::SomethingWentWrong)
}
Expand All @@ -382,7 +382,7 @@ fn parse_assign_after_zhe3(mut iter: &mut LexIter<'_>) -> Result<(DataOrQi2, Opt
_ => Err(Error::SomethingWentWrong),
}
}
lex::Lex::Shi4Yi3 => Ok((data, None)),
lex::Lex::Shi4Yi3 => Ok(Rvalue::Simple(data)),
_ => Err(Error::SomethingWentWrong),
}
}
Expand All @@ -409,13 +409,13 @@ fn parse_assign_after_xi1zhi1(mut iter: &mut LexIter<'_>) -> Result<Statement, E
lex::Lex::Zhi1 => match iter.next().ok_or(Error::UnexpectedEOF)? {
lex::Lex::IntNum(int_num) => {
if let lex::Lex::Zhe3 = iter.next().ok_or(Error::UnexpectedEOF)? {
let (data, opt_index) = parse_assign_after_zhe3(&mut iter)?;
let rvalue = parse_assign_after_zhe3(&mut iter)?;
Ok(Statement::Assignment {
lvalue: Lvalue {
ident,
opt_index: Some(interpret_intnum(&int_num)),
},
rvalue: Rvalue { data, opt_index },
rvalue,
})
} else {
Err(Error::SomethingWentWrong)
Expand All @@ -426,10 +426,13 @@ fn parse_assign_after_xi1zhi1(mut iter: &mut LexIter<'_>) -> Result<Statement, E
_ => Err(Error::SomethingWentWrong),
},
lex::Lex::Zhe3 => {
let (data, opt_index) = parse_assign_after_zhe3(&mut iter)?;
let rvalue = parse_assign_after_zhe3(&mut iter)?;
Ok(Statement::Assignment {
lvalue: Lvalue { ident, opt_index },
rvalue: Rvalue { data, opt_index },
lvalue: Lvalue {
ident,
opt_index: None,
},
rvalue,
})
}
_ => Err(Error::SomethingWentWrong),
Expand Down
8 changes: 8 additions & 0 deletions test077.wy
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
吾有一列。名之曰「甲」。充「甲」以三。充「甲」以五。

夫「甲」之長。書之。

有數一。名之曰「乙」。
恆為是。若「乙」大於「甲」之長者。乃止也。
 夫「甲」之「乙」。書之。
加「乙」以一。昔之「乙」者。今其是矣。云云。

0 comments on commit 15c36dd

Please sign in to comment.