using pest
This commit is contained in:
+67
-66
@@ -1,24 +1,24 @@
|
||||
use crate::{
|
||||
parser::{self, extract_ast, extract_values, Ast},
|
||||
utils::{ProblemCap, VariableType, Variables},
|
||||
parser::{self, Rule},
|
||||
utils::{ProblemCap, Variables},
|
||||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
||||
pub struct State {
|
||||
pub line: u32,
|
||||
pub column: u32,
|
||||
pub file: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
||||
pub struct Transpiler {
|
||||
pub matched_vars: Variables,
|
||||
pub problems: Vec<ProblemCap>,
|
||||
pub state: State,
|
||||
pub inject: Inject,
|
||||
}
|
||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
||||
pub struct Inject {
|
||||
pub state: State,
|
||||
pub inject: bool,
|
||||
@@ -54,71 +54,72 @@ impl Default for Transpiler {
|
||||
|
||||
impl Transpiler {
|
||||
pub fn transpile(&mut self, code: String, indent: usize, vars: &mut Variables) -> String {
|
||||
let ast = parser::parse(code, vars, &mut self.state.clone(), self);
|
||||
// args: code, vars, &mut self.state.clone(), self
|
||||
let ast = parser::parse(code, Rule::top_expr);
|
||||
let mut res = String::new();
|
||||
if indent > 0 {
|
||||
res += " ".repeat(indent * 2).as_str();
|
||||
}
|
||||
for a in ast {
|
||||
let astval = extract_ast(a.clone());
|
||||
if self.inject.inject {
|
||||
for val in astval {
|
||||
if val.contains("list_vx") {
|
||||
for (name, var) in vars.clone().iter_mut() {
|
||||
if self.inject.state.line > var.state.line
|
||||
|| var.vtype != VariableType::Var
|
||||
{
|
||||
self.matched_vars.vars.insert(name.clone(), var.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
match a {
|
||||
Ast::Variable(var_type, var_name) => {
|
||||
res += format!("let mut {}: {}", var_name, var_type).as_str();
|
||||
}
|
||||
Ast::Function(var_type, var_name, round, curly) => {
|
||||
res += format!(
|
||||
"fn {}({}) -> {} {}\n{}{}\n",
|
||||
var_name,
|
||||
round,
|
||||
var_type,
|
||||
"{",
|
||||
self.transpile(curly, indent + 1, &mut vars.clone()),
|
||||
"}"
|
||||
)
|
||||
.as_str();
|
||||
}
|
||||
Ast::Struct(name, curly) => {
|
||||
res += format!(
|
||||
"struct {} {}\n{}{}\n",
|
||||
name,
|
||||
"{",
|
||||
self.transpile(curly, indent + 1, &mut vars.clone()),
|
||||
"}"
|
||||
)
|
||||
.as_str()
|
||||
}
|
||||
Ast::Rust(rs) => {
|
||||
res += "{";
|
||||
res += rs.as_str();
|
||||
res += "}";
|
||||
}
|
||||
Ast::Single(x) => {
|
||||
println!("{:?}", x);
|
||||
let vals = extract_values(x);
|
||||
match vals.0 {
|
||||
2 => res += vars.get_var(vals.1, self, vals.2).as_str(),
|
||||
3 => res += format!("({})", vals.1).as_str(),
|
||||
8 => res += vals.1.as_str(),
|
||||
_ => {
|
||||
res += vals.1.as_str();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// for a in ast {
|
||||
// let astval = extract_ast(a.clone());
|
||||
// if self.inject.inject {
|
||||
// for val in astval {
|
||||
// if val.contains("list_vx") {
|
||||
// for (name, var) in vars.clone().iter_mut() {
|
||||
// if self.inject.state.line > var.state.line
|
||||
// || var.vtype != VariableType::Var
|
||||
// {
|
||||
// self.matched_vars.vars.insert(name.clone(), var.clone());
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// match a {
|
||||
// Ast::Variable(var_type, var_name) => {
|
||||
// res += format!("let mut {}: {}", var_name, var_type).as_str();
|
||||
// }
|
||||
// Ast::Function(var_type, var_name, round, curly) => {
|
||||
// res += format!(
|
||||
// "fn {}({}) -> {} {}\n{}{}\n",
|
||||
// var_name,
|
||||
// round,
|
||||
// var_type,
|
||||
// "{",
|
||||
// self.transpile(curly, indent + 1, &mut vars.clone()),
|
||||
// "}"
|
||||
// )
|
||||
// .as_str();
|
||||
// }
|
||||
// Ast::Struct(name, curly) => {
|
||||
// res += format!(
|
||||
// "struct {} {}\n{}{}\n",
|
||||
// name,
|
||||
// "{",
|
||||
// self.transpile(curly, indent + 1, &mut vars.clone()),
|
||||
// "}"
|
||||
// )
|
||||
// .as_str()
|
||||
// }
|
||||
// Ast::Rust(rs) => {
|
||||
// res += "{";
|
||||
// res += rs.as_str();
|
||||
// res += "}";
|
||||
// }
|
||||
// Ast::Single(x) => {
|
||||
// println!("{:?}", x);
|
||||
// let vals = extract_values(x);
|
||||
// match vals.0 {
|
||||
// 2 => res += vars.get_var(vals.1, self, vals.2).as_str(),
|
||||
// 3 => res += format!("({})", vals.1).as_str(),
|
||||
// 8 => res += vals.1.as_str(),
|
||||
// _ => {
|
||||
// res += vals.1.as_str();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
if indent > 0 {
|
||||
res += "\n";
|
||||
res += " ".repeat((indent - 1) * 2).as_str();
|
||||
|
||||
Reference in New Issue
Block a user