Finished refactoring

This commit is contained in:
elvis
2025-08-24 03:35:32 +02:00
parent 3a4c4d43c2
commit 9a80044a89
11 changed files with 511 additions and 301 deletions

View File

@ -2,9 +2,8 @@ use std::rc::Rc;
use std::str::FromStr;
use lalrpop_util::ParseError;
use crate::rsprocess::{set, reaction, process, environment, system, label};
use crate::rsprocess::structure::rsassert;
use crate::rsprocess::assert::types;
use crate::rsprocess::translator::{ Translator, IdType };
use crate::rsprocess::presets::Instructions;
use crate::rsprocess::presets;
use crate::rsprocess::graph;
@ -270,181 +269,181 @@ Env_term: (IdType, process::Process) = {
// -----------------------------------------------------------------------------
// AssertParser
// -----------------------------------------------------------------------------
pub Assert: Box<rsassert::RSassert> = {
pub Assert: Box<types::Assert> = {
"label" "{" <f: AssertTree> "}" =>
Box::new(rsassert::RSassert{tree: f}),
Box::new(types::Assert{tree: f}),
};
AssertTree: rsassert::Tree = {
AssertTree: types::Tree = {
<t1: AssertTree2> ";" <t2: AssertTree> =>
rsassert::Tree::Concat(Box::new(t1), Box::new(t2)),
types::Tree::Concat(Box::new(t1), Box::new(t2)),
<t: AssertTree2> => t,
}
AssertTree2: rsassert::Tree = {
AssertTree2: types::Tree = {
#[precedence(level="1")]
"if" <e: AssertExpression>
"then" "{" <t: AssertTree> "}" =>
rsassert::Tree::If(Box::new(e), Box::new(t)),
types::Tree::If(Box::new(e), Box::new(t)),
#[precedence(level="0")]
"if" <e: AssertExpression>
"then" "{" <t1: AssertTree> "}"
"else" "{" <t2: AssertTree> "}" =>
rsassert::Tree::IfElse(Box::new(e), Box::new(t1), Box::new(t2)),
types::Tree::IfElse(Box::new(e), Box::new(t1), Box::new(t2)),
#[precedence(level="2")]
"let" <v: AssertVariable> <q: AssertQualifier?> "=" <e: AssertExpression> =>
rsassert::Tree::Assignment(v, q, Box::new(e)),
types::Tree::Assignment(v, q, Box::new(e)),
#[precedence(level="3")]
"return" <e: AssertExpression> =>
rsassert::Tree::Return(Box::new(e)),
types::Tree::Return(Box::new(e)),
#[precedence(level="4")]
"for" <v: AssertVariable> "in" <r: AssertRange> "{" <t: AssertTree> "}" =>
rsassert::Tree::For(v, r, Box::new(t)),
types::Tree::For(v, r, Box::new(t)),
}
AssertVariable: rsassert::Variable = {
AssertVariable: types::Variable = {
#[precedence(level="0")]
"label" => rsassert::Variable::Special(rsassert::Special::Label),
"label" => types::Variable::Special(types::Special::Label),
#[precedence(level="1")]
"edge" => rsassert::Variable::Special(rsassert::Special::Edge),
"edge" => types::Variable::Special(types::Special::Edge),
#[precedence(level="2")]
<v: Literal> => rsassert::Variable::Id(v),
<v: Literal> => types::Variable::Id(v),
}
AssertExpression: rsassert::Expression = {
AssertExpression: types::Expression = {
// Unary
#[precedence(level="0")]
<unp: AssertUnaryPrefix> <e: AssertExpression> =>
rsassert::Expression::Unary(unp, Box::new(e)),
types::Expression::Unary(unp, Box::new(e)),
#[precedence(level="2")]
<e: AssertExpression> <uns: AssertUnarySuffix> =>
rsassert::Expression::Unary(uns, Box::new(e)),
types::Expression::Unary(uns, Box::new(e)),
// binary
#[precedence(level="3")] #[assoc(side="left")]
<e1: AssertExpression> <b: AssertBinary> <e2: AssertExpression> =>
rsassert::Expression::Binary(b, Box::new(e1), Box::new(e2)),
types::Expression::Binary(b, Box::new(e1), Box::new(e2)),
#[precedence(level="1")]
<b: AssertBinaryPrefix>
"(" <e1: AssertExpression> "," <e2: AssertExpression> ")" =>
rsassert::Expression::Binary(b, Box::new(e1), Box::new(e2)),
types::Expression::Binary(b, Box::new(e1), Box::new(e2)),
#[precedence(level="4")]
"(" <e: AssertExpression> ")" => e,
"true" => rsassert::Expression::True,
"false" => rsassert::Expression::False,
"true" => types::Expression::True,
"false" => types::Expression::False,
#[precedence(level="5")]
<v: AssertVariable> => rsassert::Expression::Var(v),
<v: AssertVariable> => types::Expression::Var(v),
// If changing IntegerType in assert.rs, also change from Num to another
// similar parser with different return type
#[precedence(level="6")]
<i: Num> => rsassert::Expression::Integer(i),
<i: Num> => types::Expression::Integer(i),
#[precedence(level="7")]
<lab: AssertLabel> => rsassert::Expression::Label(Box::new(lab)),
<set: Set_of_entities> => rsassert::Expression::Set(set),
"'" <el: Literal> "'" => rsassert::Expression::Element(translator.encode(el)),
<lab: AssertLabel> => types::Expression::Label(Box::new(lab)),
<set: Set_of_entities> => types::Expression::Set(set),
"'" <el: Literal> "'" => types::Expression::Element(translator.encode(el)),
// strings
#[precedence(level="8")]
PATH => rsassert::Expression::String(<>.trim_end_matches("\"")
PATH => types::Expression::String(<>.trim_end_matches("\"")
.trim_start_matches("\"")
.to_string()),
}
AssertRange: rsassert::Range = {
"{" <e: AssertExpression> "}" => rsassert::Range::IterateOverSet(Box::new(e)),
AssertRange: types::Range = {
"{" <e: AssertExpression> "}" => types::Range::IterateOverSet(Box::new(e)),
"{" <e1: AssertExpression> ".." <e2: AssertExpression> "}" =>
rsassert::Range::IterateInRange(Box::new(e1), Box::new(e2)),
types::Range::IterateInRange(Box::new(e1), Box::new(e2)),
}
AssertUnaryPrefix: rsassert::Unary = {
"not" => rsassert::Unary::Not,
"rand" => rsassert::Unary::Rand,
AssertUnaryPrefix: types::Unary = {
"not" => types::Unary::Not,
"rand" => types::Unary::Rand,
}
AssertUnarySuffix: rsassert::Unary = {
AssertUnarySuffix: types::Unary = {
#[precedence(level="0")]
"." "empty" => rsassert::Unary::Empty,
"." "length" => rsassert::Unary::Length,
"." "tostr" => rsassert::Unary::ToStr,
"." "toel" => rsassert::Unary::ToEl,
"." "empty" => types::Unary::Empty,
"." "length" => types::Unary::Length,
"." "tostr" => types::Unary::ToStr,
"." "toel" => types::Unary::ToEl,
#[precedence(level="1")]
"." <q: AssertQualifier> => rsassert::Unary::Qualifier(q),
"." <q: AssertQualifier> => types::Unary::Qualifier(q),
}
AssertQualifierRestricted: rsassert::QualifierRestricted = {
"Entities" => rsassert::QualifierRestricted::Entities,
"Context" => rsassert::QualifierRestricted::Context,
"Reactants" => rsassert::QualifierRestricted::Reactants,
"ReactantsAbsent" => rsassert::QualifierRestricted::ReactantsAbsent,
"Inhibitors" => rsassert::QualifierRestricted::Inhibitors,
"InhibitorsPresent" => rsassert::QualifierRestricted::InhibitorsPresent,
"Products" => rsassert::QualifierRestricted::Products,
AssertQualifierRestricted: types::QualifierRestricted = {
"Entities" => types::QualifierRestricted::Entities,
"Context" => types::QualifierRestricted::Context,
"Reactants" => types::QualifierRestricted::Reactants,
"ReactantsAbsent" => types::QualifierRestricted::ReactantsAbsent,
"Inhibitors" => types::QualifierRestricted::Inhibitors,
"InhibitorsPresent" => types::QualifierRestricted::InhibitorsPresent,
"Products" => types::QualifierRestricted::Products,
}
AssertQualifierLabel: rsassert::QualifierLabel = {
"AvailableEntities" => rsassert::QualifierLabel::AvailableEntities,
"AllReactants" => rsassert::QualifierLabel::AllReactants,
"AllInhibitors" => rsassert::QualifierLabel::AllInhibitors,
AssertQualifierLabel: types::QualifierLabel = {
"AvailableEntities" => types::QualifierLabel::AvailableEntities,
"AllReactants" => types::QualifierLabel::AllReactants,
"AllInhibitors" => types::QualifierLabel::AllInhibitors,
}
AssertQualifierSystem: rsassert::QualifierSystem = {
"SystemEntities" => rsassert::QualifierSystem::Entities,
"SystemContext" => rsassert::QualifierSystem::Context,
AssertQualifierSystem: types::QualifierSystem = {
"SystemEntities" => types::QualifierSystem::Entities,
"SystemContext" => types::QualifierSystem::Context,
}
AssertQualifierEdge: rsassert::QualifierEdge = {
"source" => rsassert::QualifierEdge::Source,
"target" => rsassert::QualifierEdge::Target,
AssertQualifierEdge: types::QualifierEdge = {
"source" => types::QualifierEdge::Source,
"target" => types::QualifierEdge::Target,
}
AssertQualifierNode: rsassert::QualifierNode = {
"neighbours" => rsassert::QualifierNode::Neighbours,
"system" => rsassert::QualifierNode::System,
AssertQualifierNode: types::QualifierNode = {
"neighbours" => types::QualifierNode::Neighbours,
"system" => types::QualifierNode::System,
}
AssertQualifier: rsassert::Qualifier = {
<q: AssertQualifierSystem> => rsassert::Qualifier::System(q),
<q: AssertQualifierLabel> => rsassert::Qualifier::Label(q),
<q: AssertQualifierRestricted> => rsassert::Qualifier::Restricted(q),
<q: AssertQualifierEdge> => rsassert::Qualifier::Edge(q),
<q: AssertQualifierNode> => rsassert::Qualifier::Node(q),
AssertQualifier: types::Qualifier = {
<q: AssertQualifierSystem> => types::Qualifier::System(q),
<q: AssertQualifierLabel> => types::Qualifier::Label(q),
<q: AssertQualifierRestricted> => types::Qualifier::Restricted(q),
<q: AssertQualifierEdge> => types::Qualifier::Edge(q),
<q: AssertQualifierNode> => types::Qualifier::Node(q),
}
AssertBinary: rsassert::Binary = {
"&&" => rsassert::Binary::And,
"||" => rsassert::Binary::Or,
"^^" => rsassert::Binary::Xor,
"<" => rsassert::Binary::Less,
"<=" => rsassert::Binary::LessEq,
">" => rsassert::Binary::More,
">=" => rsassert::Binary::MoreEq,
"==" => rsassert::Binary::Eq,
"!=" => rsassert::Binary::NotEq,
"+" => rsassert::Binary::Plus,
"-" => rsassert::Binary::Minus,
"*" => rsassert::Binary::Times,
"^" => rsassert::Binary::Exponential,
"/" => rsassert::Binary::Quotient,
"%" => rsassert::Binary::Reminder,
"::" => rsassert::Binary::Concat,
AssertBinary: types::Binary = {
"&&" => types::Binary::And,
"||" => types::Binary::Or,
"^^" => types::Binary::Xor,
"<" => types::Binary::Less,
"<=" => types::Binary::LessEq,
">" => types::Binary::More,
">=" => types::Binary::MoreEq,
"==" => types::Binary::Eq,
"!=" => types::Binary::NotEq,
"+" => types::Binary::Plus,
"-" => types::Binary::Minus,
"*" => types::Binary::Times,
"^" => types::Binary::Exponential,
"/" => types::Binary::Quotient,
"%" => types::Binary::Reminder,
"::" => types::Binary::Concat,
}
AssertBinaryPrefix: rsassert::Binary = {
"substr" => rsassert::Binary::SubStr,
"min" => rsassert::Binary::Min,
"max" => rsassert::Binary::Max,
"commonsubstr" => rsassert::Binary::CommonSubStr,
AssertBinaryPrefix: types::Binary = {
"substr" => types::Binary::SubStr,
"min" => types::Binary::Min,
"max" => types::Binary::Max,
"commonsubstr" => types::Binary::CommonSubStr,
}
@ -858,17 +857,17 @@ Instruction: presets::Instruction = {
pub Run: presets::Instructions = {
#[precedence(level="0")]
<sys: System> <instr: Separated_Or<Instruction, ",">> =>
Instructions { system: presets::System::System { sys },
instructions: instr },
presets::Instructions { system: presets::System::System { sys },
instructions: instr },
#[precedence(level="1")]
<sys: System> =>
Instructions { system: presets::System::System { sys },
instructions: vec![] },
presets::Instructions { system: presets::System::System { sys },
instructions: vec![] },
#[precedence(level="2")]
"Deserialize" "(" <path: Path> ")"
<instr: Separated_Or<Instruction, ",">> =>
Instructions { system: presets::System::Deserialize { path },
instructions: instr },
presets::Instructions { system: presets::System::Deserialize { path },
instructions: instr },
}