mirror of
https://github.com/Dummi26/mers.git
synced 2025-12-14 03:16:15 +01:00
add #include
This commit is contained in:
@@ -1,4 +1,7 @@
|
||||
use crate::program::{self, run::SourceRange};
|
||||
use crate::program::{
|
||||
self,
|
||||
run::{CheckError, SourceRange},
|
||||
};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
|
||||
@@ -17,7 +20,7 @@ impl MersStatement for AssignTo {
|
||||
&self,
|
||||
info: &mut crate::info::Info<super::Local>,
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, String> {
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
Ok(Box::new(program::run::assign_to::AssignTo {
|
||||
pos_in_src: self.pos_in_src,
|
||||
is_init: false,
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
use crate::{
|
||||
info,
|
||||
program::{self, run::SourceRange},
|
||||
program::{
|
||||
self,
|
||||
run::{CheckError, SourceRange},
|
||||
},
|
||||
};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
@@ -18,7 +21,7 @@ impl MersStatement for Block {
|
||||
&self,
|
||||
info: &mut info::Info<super::Local>,
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, String> {
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
Ok(Box::new(program::run::block::Block {
|
||||
pos_in_src: self.pos_in_src,
|
||||
statements: self
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use crate::program::run::SourceRange;
|
||||
use crate::program::run::{CheckError, SourceRange};
|
||||
use crate::{info, program};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
@@ -17,7 +17,7 @@ impl MersStatement for Chain {
|
||||
&self,
|
||||
info: &mut info::Info<super::Local>,
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, String> {
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
Ok(Box::new(program::run::chain::Chain {
|
||||
pos_in_src: self.pos_in_src,
|
||||
first: self.first.compile(info, comp)?,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use crate::program::run::SourceRange;
|
||||
use crate::program::run::{CheckError, SourceRange};
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
||||
use crate::{
|
||||
@@ -24,7 +24,7 @@ impl MersStatement for Function {
|
||||
&self,
|
||||
info: &mut crate::info::Info<super::Local>,
|
||||
mut comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, String> {
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
comp.is_init = true;
|
||||
let arg_target = Arc::new(self.arg.compile(info, comp)?);
|
||||
comp.is_init = false;
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
use crate::program::{self, run::SourceRange};
|
||||
use crate::program::{
|
||||
self,
|
||||
run::{CheckError, SourceRange},
|
||||
};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
|
||||
@@ -18,7 +21,7 @@ impl MersStatement for If {
|
||||
&self,
|
||||
info: &mut crate::info::Info<super::Local>,
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, String> {
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
Ok(Box::new(program::run::r#if::If {
|
||||
pos_in_src: self.pos_in_src,
|
||||
condition: self.condition.compile(info, comp)?,
|
||||
|
||||
60
mers_lib/src/program/parsed/include_mers.rs
Normal file
60
mers_lib/src/program/parsed/include_mers.rs
Normal file
@@ -0,0 +1,60 @@
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
||||
use colored::Colorize;
|
||||
|
||||
use crate::{
|
||||
data::{self, Data},
|
||||
info::{self, Local},
|
||||
program::{
|
||||
self,
|
||||
run::{CheckError, SourceRange},
|
||||
},
|
||||
};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct IncludeMers {
|
||||
pub pos_in_src: SourceRange,
|
||||
pub include: Box<dyn MersStatement>,
|
||||
}
|
||||
impl MersStatement for IncludeMers {
|
||||
fn has_scope(&self) -> bool {
|
||||
true
|
||||
}
|
||||
fn compile_custom(
|
||||
&self,
|
||||
info: &mut info::Info<super::Local>,
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
let compiled = match self.include.compile(info, comp) {
|
||||
Ok(v) => Arc::new(v),
|
||||
Err(e) => {
|
||||
return Err(CheckError::new()
|
||||
.src(vec![(self.pos_in_src, Some(colored::Color::Red))])
|
||||
.msg("Error in inner mers statement! (note: inner errors may refer to a different file)".red().to_string())
|
||||
.err(e))
|
||||
}
|
||||
};
|
||||
let compiled2 = Arc::clone(&compiled);
|
||||
Ok(Box::new(program::run::chain::Chain {
|
||||
pos_in_src: self.pos_in_src,
|
||||
first: Box::new(program::run::value::Value {
|
||||
pos_in_src: self.pos_in_src,
|
||||
val: Data::empty_tuple(),
|
||||
}),
|
||||
chained: Box::new(program::run::function::Function {
|
||||
pos_in_src: self.pos_in_src,
|
||||
func_no_info: data::function::Function {
|
||||
info: Arc::new(info::Info::neverused()),
|
||||
info_check: Arc::new(Mutex::new(info::Info::neverused())),
|
||||
out: Arc::new(move |_, i| compiled.check(&mut i.duplicate(), None)),
|
||||
run: Arc::new(move |_, i| compiled2.run(&mut i.duplicate())),
|
||||
},
|
||||
}),
|
||||
}))
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
use crate::program;
|
||||
use crate::program::run::SourceRange;
|
||||
use crate::program::{self, run::CheckError};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
|
||||
@@ -18,7 +18,7 @@ impl MersStatement for InitTo {
|
||||
&self,
|
||||
info: &mut crate::info::Info<super::Local>,
|
||||
mut comp: CompInfo,
|
||||
) -> Result<Box<dyn crate::program::run::MersStatement>, String> {
|
||||
) -> Result<Box<dyn crate::program::run::MersStatement>, CheckError> {
|
||||
comp.is_init = true;
|
||||
let target = self.target.compile(info, comp)?;
|
||||
comp.is_init = false;
|
||||
|
||||
@@ -2,7 +2,7 @@ use std::{collections::HashMap, fmt::Debug};
|
||||
|
||||
use crate::info;
|
||||
|
||||
use super::run::SourceRange;
|
||||
use super::run::{CheckError, SourceRange};
|
||||
|
||||
#[cfg(feature = "parse")]
|
||||
pub mod assign_to;
|
||||
@@ -15,6 +15,8 @@ pub mod function;
|
||||
#[cfg(feature = "parse")]
|
||||
pub mod r#if;
|
||||
#[cfg(feature = "parse")]
|
||||
pub mod include_mers;
|
||||
#[cfg(feature = "parse")]
|
||||
pub mod init_to;
|
||||
#[cfg(feature = "parse")]
|
||||
pub mod tuple;
|
||||
@@ -29,12 +31,12 @@ pub trait MersStatement: Debug + Send + Sync {
|
||||
&self,
|
||||
info: &mut Info,
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn super::run::MersStatement>, String>;
|
||||
) -> Result<Box<dyn super::run::MersStatement>, CheckError>;
|
||||
fn compile(
|
||||
&self,
|
||||
info: &mut Info,
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn super::run::MersStatement>, String> {
|
||||
) -> Result<Box<dyn super::run::MersStatement>, CheckError> {
|
||||
if self.has_scope() {
|
||||
info.create_scope();
|
||||
}
|
||||
@@ -77,4 +79,7 @@ impl info::Local for Local {
|
||||
fn get_var_mut(&mut self, id: &Self::VariableIdentifier) -> Option<&mut Self::VariableData> {
|
||||
self.vars.get_mut(id)
|
||||
}
|
||||
fn duplicate(&self) -> Self {
|
||||
self.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
use crate::{
|
||||
info,
|
||||
program::{self, run::SourceRange},
|
||||
program::{
|
||||
self,
|
||||
run::{CheckError, SourceRange},
|
||||
},
|
||||
};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
@@ -18,7 +21,7 @@ impl MersStatement for Tuple {
|
||||
&self,
|
||||
info: &mut info::Info<super::Local>,
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, String> {
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
Ok(Box::new(program::run::tuple::Tuple {
|
||||
pos_in_src: self.pos_in_src,
|
||||
elems: self
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use crate::program::run::SourceRange;
|
||||
use crate::program::run::{CheckError, SourceRange};
|
||||
use crate::{data::Data, program};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
@@ -17,7 +17,7 @@ impl MersStatement for Value {
|
||||
&self,
|
||||
_info: &mut crate::info::Info<super::Local>,
|
||||
_comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, String> {
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
Ok(Box::new(program::run::value::Value {
|
||||
pos_in_src: self.pos_in_src,
|
||||
val: self.data.clone(),
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
use crate::{
|
||||
info::Local,
|
||||
program::{self, run::SourceRange},
|
||||
program::{
|
||||
self,
|
||||
run::{CheckError, SourceRange},
|
||||
},
|
||||
};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
@@ -20,7 +23,7 @@ impl MersStatement for Variable {
|
||||
&self,
|
||||
info: &mut crate::info::Info<super::Local>,
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, String> {
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
if comp.is_init {
|
||||
info.init_var(
|
||||
self.var.clone(),
|
||||
@@ -37,7 +40,9 @@ impl MersStatement for Variable {
|
||||
var: if let Some(v) = info.get_var(&self.var) {
|
||||
*v
|
||||
} else {
|
||||
return Err(format!("No variable named '{}' found!", self.var));
|
||||
return Err(CheckError::new()
|
||||
.src(vec![(self.pos_in_src, Some(colored::Color::Red))])
|
||||
.msg(format!("No variable named '{}' found!", self.var)));
|
||||
},
|
||||
}))
|
||||
}
|
||||
|
||||
@@ -268,6 +268,15 @@ impl info::Local for Local {
|
||||
None => None,
|
||||
}
|
||||
}
|
||||
fn duplicate(&self) -> Self {
|
||||
Self {
|
||||
vars: self
|
||||
.vars
|
||||
.iter()
|
||||
.map(|v| Arc::new(RwLock::new(v.read().unwrap().clone())))
|
||||
.collect(),
|
||||
}
|
||||
}
|
||||
}
|
||||
impl info::Local for CheckLocal {
|
||||
type VariableIdentifier = usize;
|
||||
@@ -290,4 +299,7 @@ impl info::Local for CheckLocal {
|
||||
None => None,
|
||||
}
|
||||
}
|
||||
fn duplicate(&self) -> Self {
|
||||
self.clone()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user