mirror of
https://github.com/kmc7468/cs420.git
synced 2025-12-14 22:38:46 +00:00
HW1 (3)
코드 정리
This commit is contained in:
@@ -50,7 +50,7 @@ impl WriteString for Declaration {
|
||||
format!(
|
||||
"{} {}",
|
||||
self.specifiers.write_string(),
|
||||
self.declarators.write_string()
|
||||
self.declarators.iter().map(|d| d.write_string()).join(", ")
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -174,12 +174,6 @@ impl WriteString for FunctionSpecifier {
|
||||
}
|
||||
}
|
||||
|
||||
impl WriteString for Vec<Node<InitDeclarator>> {
|
||||
fn write_string(&self) -> String {
|
||||
self.iter().map(|d| d.write_string()).join(", ")
|
||||
}
|
||||
}
|
||||
|
||||
impl WriteString for InitDeclarator {
|
||||
fn write_string(&self) -> String {
|
||||
format!(
|
||||
@@ -196,51 +190,42 @@ impl WriteString for InitDeclarator {
|
||||
impl WriteString for Declarator {
|
||||
fn write_string(&self) -> String {
|
||||
match &self.kind.node {
|
||||
DeclaratorKind::Abstract => {
|
||||
// println!("DEBUG: ABSTRACT {}", self.derived.write_string());
|
||||
self.derived.write_string()
|
||||
}
|
||||
DeclaratorKind::Abstract => self.derived.iter().map(|d| d.write_string()).join(" "),
|
||||
DeclaratorKind::Identifier(id) => {
|
||||
// println!(
|
||||
// "DEBUG: IDENTIFIER({}) {}",
|
||||
// id.write_string(),
|
||||
// self.derived.write_string()
|
||||
// );
|
||||
let mut result = String::new();
|
||||
let mut id_used = false;
|
||||
for declarator in &self.derived {
|
||||
if let DerivedDeclarator::Pointer(_) = declarator.node {
|
||||
result += format!(" {}", declarator.write_string()).as_str();
|
||||
result += &format!(" {}", declarator.write_string());
|
||||
} else {
|
||||
if !id_used {
|
||||
id_used = true;
|
||||
result += format!(" {}", id.write_string()).as_str();
|
||||
result += &id.write_string();
|
||||
}
|
||||
result += format!(" {}", declarator.write_string()).as_str();
|
||||
result += &format!(" {}", declarator.write_string());
|
||||
}
|
||||
}
|
||||
if !id_used {
|
||||
result += format!(" {}", id.write_string()).as_str();
|
||||
result += &id.write_string();
|
||||
}
|
||||
result
|
||||
}
|
||||
DeclaratorKind::Declarator(decl) => {
|
||||
// println!("DEBUG: DECLARATOR {}", self.derived.write_string());
|
||||
let mut result = String::new();
|
||||
let mut id_used = false;
|
||||
let mut decl_used = false;
|
||||
for declarator in &self.derived {
|
||||
if let DerivedDeclarator::Pointer(_) = declarator.node {
|
||||
result += format!(" {}", declarator.write_string()).as_str();
|
||||
result += &format!(" {}", declarator.write_string());
|
||||
} else {
|
||||
if !id_used {
|
||||
id_used = true;
|
||||
result += format!("({})", decl.write_string()).as_str();
|
||||
if !decl_used {
|
||||
decl_used = true;
|
||||
result += &format!("({})", decl.write_string());
|
||||
}
|
||||
result += format!(" {}", declarator.write_string()).as_str();
|
||||
result += &format!(" {}", declarator.write_string());
|
||||
}
|
||||
}
|
||||
if !id_used {
|
||||
result += format!("({})", decl.write_string()).as_str();
|
||||
if !decl_used {
|
||||
result += &format!("({})", decl.write_string());
|
||||
}
|
||||
result
|
||||
}
|
||||
@@ -248,12 +233,6 @@ impl WriteString for Declarator {
|
||||
}
|
||||
}
|
||||
|
||||
impl WriteString for Vec<Node<DerivedDeclarator>> {
|
||||
fn write_string(&self) -> String {
|
||||
self.iter().map(|d| d.write_string()).join(" ")
|
||||
}
|
||||
}
|
||||
|
||||
impl WriteString for DerivedDeclarator {
|
||||
fn write_string(&self) -> String {
|
||||
match self {
|
||||
@@ -298,15 +277,15 @@ impl WriteString for ArrayDeclarator {
|
||||
|
||||
impl WriteString for FunctionDeclarator {
|
||||
fn write_string(&self) -> String {
|
||||
let ellipsis = if let Ellipsis::Some = self.ellipsis {
|
||||
String::from(", ...")
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
format!(
|
||||
"{}{ellipsis}",
|
||||
self.parameters.iter().map(|p| p.write_string()).join(", ")
|
||||
)
|
||||
self.parameters
|
||||
.iter()
|
||||
.map(|p| p.write_string())
|
||||
.chain(if let Ellipsis::Some = self.ellipsis {
|
||||
Some("...".to_string())
|
||||
} else {
|
||||
None
|
||||
})
|
||||
.join(", ")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -346,15 +325,13 @@ impl WriteLine for Statement {
|
||||
write_indent(indent, write);
|
||||
writeln!(write, "{{");
|
||||
blks.iter()
|
||||
.try_for_each(|b| b.write_line(indent + 1, write))?;
|
||||
.try_for_each(|b| b.write_line(indent + 1, write));
|
||||
write_indent(indent, write);
|
||||
writeln!(write, "}}");
|
||||
Ok(())
|
||||
writeln!(write, "}}")
|
||||
}
|
||||
Self::Expression(expr) => {
|
||||
write_indent(indent, write);
|
||||
writeln!(write, "{};", expr.write_string());
|
||||
Ok(())
|
||||
writeln!(write, "{};", expr.write_string())
|
||||
}
|
||||
Self::If(if_stat) => if_stat.write_line(indent, write),
|
||||
Self::Switch(switch_stat) => switch_stat.write_line(indent, write),
|
||||
@@ -377,12 +354,7 @@ impl WriteLine for Statement {
|
||||
expr.as_ref().map_or(String::from(""), |e| e.write_string())
|
||||
)
|
||||
}
|
||||
Self::Asm(_) => panic!("Extension"),
|
||||
_ => {
|
||||
write_indent(indent, write);
|
||||
writeln!(write, "TODO");
|
||||
Ok(())
|
||||
}
|
||||
_ => todo!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -390,8 +362,8 @@ impl WriteLine for Statement {
|
||||
impl WriteLine for LabeledStatement {
|
||||
fn write_line(&self, indent: usize, write: &mut dyn Write) -> Result<()> {
|
||||
write_indent(indent, write);
|
||||
writeln!(write, "{}\n", self.label.write_string());
|
||||
self.statement.write_line(indent + 1, write)
|
||||
writeln!(write, "{}", self.label.write_string());
|
||||
self.statement.write_line(indent, write)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -420,11 +392,11 @@ impl WriteLine for IfStatement {
|
||||
fn write_line(&self, indent: usize, write: &mut dyn Write) -> Result<()> {
|
||||
write_indent(indent, write);
|
||||
writeln!(write, "if ({})", self.condition.write_string());
|
||||
self.then_statement.write_line(indent, write)?;
|
||||
self.then_statement.write_line(indent, write);
|
||||
if let Some(else_statement) = &self.else_statement {
|
||||
write_indent(indent, write);
|
||||
writeln!(write, "else");
|
||||
else_statement.write_line(indent, write)?;
|
||||
else_statement.write_line(indent, write);
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -450,7 +422,7 @@ impl WriteLine for DoWhileStatement {
|
||||
fn write_line(&self, indent: usize, write: &mut dyn Write) -> Result<()> {
|
||||
write_indent(indent, write);
|
||||
writeln!(write, "do");
|
||||
self.statement.write_line(indent, write)?;
|
||||
self.statement.write_line(indent, write);
|
||||
write_indent(indent, write);
|
||||
writeln!(write, "while ({});", self.expression.write_string())
|
||||
}
|
||||
@@ -603,7 +575,7 @@ impl WriteString for FloatSuffix {
|
||||
impl WriteString for MemberExpression {
|
||||
fn write_string(&self) -> String {
|
||||
format!(
|
||||
"({}{}{})",
|
||||
"{}{}{}",
|
||||
self.expression.write_string(),
|
||||
match self.operator.node {
|
||||
MemberOperator::Direct => ".",
|
||||
@@ -679,7 +651,7 @@ impl WriteString for UnaryOperatorExpression {
|
||||
impl WriteString for CastExpression {
|
||||
fn write_string(&self) -> String {
|
||||
format!(
|
||||
"({})({})",
|
||||
"({}){}",
|
||||
self.type_name.write_string(),
|
||||
self.expression.write_string()
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user