Refactoring

This commit is contained in:
elvis
2025-08-16 21:52:36 +02:00
parent 1face6efda
commit a0a2f01c30
4 changed files with 2102 additions and 2020 deletions

View File

@ -5,7 +5,7 @@ use crate::rsprocess::structure::{RSset,
RSprocess,
RSenvironment,
RSsystem,
RSlabel,
// RSlabel,
RSreaction};
use crate::rsprocess::structure::assert;
use crate::rsprocess::translator::{Translator, IdType};
@ -180,164 +180,174 @@ Env_term: (IdType, RSprocess) = {
// -----------------------------------------------------------------------------
// AssertParser
// -----------------------------------------------------------------------------
pub Assert: Box<assert::RSassert> = {
"label" "{" <f: AssertTree> "}" =>
Box::new(assert::RSassert{tree: f}),
};
// pub Assert: Box<assert::RSassert> = {
// "label" "{" <f: AssertTree> "}" =>
// Box::new(assert::RSassert{tree: f}),
// };
AssertTree: assert::Tree = {
<t1: AssertTree2> ";" <t2: AssertTree> =>
assert::Tree::Concat(Box::new(t1), Box::new(t2)),
<t: AssertTree2> => t,
}
// AssertTree: assert::Tree = {
// <t1: AssertTree2> ";" <t2: AssertTree> =>
// assert::Tree::Concat(Box::new(t1), Box::new(t2)),
// <t: AssertTree2> => t,
// }
AssertTree2: assert::Tree = {
"if" <e: AssertExpression>
"then" "{" <t: AssertTree> "}" =>
assert::Tree::If(Box::new(e), Box::new(t)),
// AssertTree2: assert::Tree = {
// "if" <e: AssertExpression>
// "then" "{" <t: AssertTree> "}" =>
// assert::Tree::If(Box::new(e), Box::new(t)),
"if" <e: AssertExpression>
"then" "{" <t1: AssertTree> "}"
"else" "{" <t2: AssertTree> "}" =>
assert::Tree::IfElse(Box::new(e), Box::new(t1), Box::new(t2)),
// "if" <e: AssertExpression>
// "then" "{" <t1: AssertTree> "}"
// "else" "{" <t2: AssertTree> "}" =>
// assert::Tree::IfElse(Box::new(e), Box::new(t1), Box::new(t2)),
"let" <v: AssertAssignmentVar> "=" <e: AssertExpression> =>
assert::Tree::Assignment(v, Box::new(e)),
// "let" <v: AssertVariable> <q: AssertQualifierLet?> "=" <e: AssertExpression> =>
// assert::Tree::Assignment(v, q, Box::new(e)),
"return" <e: AssertExpression> =>
assert::Tree::Return(Box::new(e)),
// "return" <e: AssertExpression> =>
// assert::Tree::Return(Box::new(e)),
"for" <v: AssertVariable> "in" <r: AssertRange> "{" <t: AssertTree> "}" =>
assert::Tree::For(v, r, Box::new(t)),
}
// "for" <v: AssertVariable> "in" <r: AssertRange> "{" <t: AssertTree> "}" =>
// assert::Tree::For(v, r, Box::new(t)),
// }
AssertAssignmentVar: assert::AssignmentVariable = {
<v: AssertVariable> => assert::AssignmentVariable::Var(v),
<v: AssertVariable> "." <q: AssertQualifierRestricted> =>
assert::AssignmentVariable::QualifiedVar(v, q),
}
// AssertQualifierLet: assert::Qualifier {
// "Entities" => assert::QualifierRestricted::Entities,
// "Context" => assert::QualifierRestricted::Context,
// "Reactants" => assert::QualifierRestricted::Reactants,
// "ReactantsAbsent" => assert::QualifierRestricted::ReactantsAbsent,
// "Inhibitors" => assert::QualifierRestricted::Inhibitors,
// "InhibitorsPresent" => assert::QualifierRestricted::InhibitorsPresent,
// "Products" => assert::QualifierRestricted::Products,
// }
AssertVariable: assert::Variable = {
"label" => assert::Variable::Label,
"edge" => assert::Variable::Edge,
<v: Literal> => assert::Variable::Id(v),
}
// AssertAssignmentVar: assert::AssignmentVariable = {
// <v: AssertVariable> => assert::AssignmentVariable::Var(v),
// <v: AssertVariable> "." <q: AssertQualifierRestricted> =>
// assert::AssignmentVariable::QualifiedVar(v, q),
// }
AssertExpression: assert::Expression = {
<unp: AssertUnaryPrefix> <e: AssertExpression> =>
assert::Expression::Unary(unp, Box::new(e)),
"(" <e: AssertExpression> ")" <uns: AssertUnarySuffix> =>
assert::Expression::Unary(uns, Box::new(e)),
// AssertVariable: assert::Variable = {
// "label" => assert::Variable::Label,
// "edge" => assert::Variable::Edge,
// <v: Literal> => assert::Variable::Id(v),
// }
"(" <e1: AssertExpression> <b: AssertBinary> <e2: AssertExpression> ")" =>
assert::Expression::Binary(b, Box::new(e1), Box::new(e2)),
<b: AssertBinaryPrefix>
"(" <e1: AssertExpression> "," <e2: AssertExpression> ")" =>
assert::Expression::Binary(b, Box::new(e1), Box::new(e2)),
// AssertExpression: assert::Expression = {
// <unp: AssertUnaryPrefix> <e: AssertExpression> =>
// assert::Expression::Unary(unp, Box::new(e)),
// "(" <e: AssertExpression> ")" <uns: AssertUnarySuffix> =>
// assert::Expression::Unary(uns, Box::new(e)),
"(" <e: AssertExpression> ")" => e,
"true" => assert::Expression::True,
"false" => assert::Expression::False,
// "(" <e1: AssertExpression> <b: AssertBinary> <e2: AssertExpression> ")" =>
// assert::Expression::Binary(b, Box::new(e1), Box::new(e2)),
// <b: AssertBinaryPrefix>
// "(" <e1: AssertExpression> "," <e2: AssertExpression> ")" =>
// assert::Expression::Binary(b, Box::new(e1), Box::new(e2)),
<v: AssertAssignmentVar> => assert::Expression::Var(v),
// "(" <e: AssertExpression> ")" => e,
// "true" => assert::Expression::True,
// "false" => assert::Expression::False,
// If changing IntegerType in assert.rs, also change from Num to another
// similar parser with different return type
<i: Num> => assert::Expression::Integer(i),
// <v: AssertAssignmentVar> => assert::Expression::Var(v),
<lab: AssertLabel> => assert::Expression::Label(Box::new(lab)),
<set: Set_of_entities> => assert::Expression::Set(set),
"'" <el: Literal> "'" => assert::Expression::Element(translator.encode(el)),
// // If changing IntegerType in assert.rs, also change from Num to another
// // similar parser with different return type
// <i: Num> => assert::Expression::Integer(i),
// strings
PATH => assert::Expression::String(<>.trim_end_matches("\"")
.trim_start_matches("\"")
.to_string()),
}
// <lab: AssertLabel> => assert::Expression::Label(Box::new(lab)),
// <set: Set_of_entities> => assert::Expression::Set(set),
// "'" <el: Literal> "'" => assert::Expression::Element(translator.encode(el)),
AssertUnaryPrefix: assert::Unary = {
"not" => assert::Unary::Not,
"rand" => assert::Unary::Rand,
}
// // strings
// PATH => assert::Expression::String(<>.trim_end_matches("\"")
// .trim_start_matches("\"")
// .to_string()),
// }
AssertUnarySuffix: assert::Unary = {
".empty" => assert::Unary::Empty,
".length" => assert::Unary::Length,
".tostr" => assert::Unary::ToStr,
".toel" => assert::Unary::ToEl,
".source" => assert::Unary::Source,
".target" => assert::Unary::Target,
".neighbours" => assert::Unary::Neighbours,
".system" => assert::Unary::System,
"." <q: AssertQualifierLabel> => assert::Unary::QualifierLabel(q),
"." <q: AssertQualifierSystem> => assert::Unary::QualifierSystem(q),
}
// AssertUnaryPrefix: assert::Unary = {
// "not" => assert::Unary::Not,
// "rand" => assert::Unary::Rand,
// }
AssertBinary: assert::Binary = {
"&&" => assert::Binary::And,
"||" => assert::Binary::Or,
"^^" => assert::Binary::Xor,
"<" => assert::Binary::Less,
"<=" => assert::Binary::LessEq,
">" => assert::Binary::More,
">=" => assert::Binary::MoreEq,
"==" => assert::Binary::Eq,
"!=" => assert::Binary::NotEq,
"+" => assert::Binary::Plus,
"-" => assert::Binary::Minus,
"*" => assert::Binary::Times,
"^" => assert::Binary::Exponential,
"/" => assert::Binary::Quotient,
"%" => assert::Binary::Reminder,
"::" => assert::Binary::Concat,
}
// AssertUnarySuffix: assert::Unary = {
// ".empty" => assert::Unary::Empty,
// ".length" => assert::Unary::Length,
// ".tostr" => assert::Unary::ToStr,
// ".toel" => assert::Unary::ToEl,
// ".source" => assert::Unary::Source,
// ".target" => assert::Unary::Target,
// ".neighbours" => assert::Unary::Neighbours,
// ".system" => assert::Unary::System,
// "." <q: AssertQualifierLabel> => assert::Unary::QualifierLabel(q),
// "." <q: AssertQualifierSystem> => assert::Unary::QualifierSystem(q),
// }
AssertBinaryPrefix: assert::Binary = {
"substr" => assert::Binary::SubStr,
"min" => assert::Binary::Min,
"max" => assert::Binary::Max,
"commonsubstr" => assert::Binary::CommonSubStr,
}
// AssertBinary: assert::Binary = {
// "&&" => assert::Binary::And,
// "||" => assert::Binary::Or,
// "^^" => assert::Binary::Xor,
// "<" => assert::Binary::Less,
// "<=" => assert::Binary::LessEq,
// ">" => assert::Binary::More,
// ">=" => assert::Binary::MoreEq,
// "==" => assert::Binary::Eq,
// "!=" => assert::Binary::NotEq,
// "+" => assert::Binary::Plus,
// "-" => assert::Binary::Minus,
// "*" => assert::Binary::Times,
// "^" => assert::Binary::Exponential,
// "/" => assert::Binary::Quotient,
// "%" => assert::Binary::Reminder,
// "::" => assert::Binary::Concat,
// }
AssertQualifierSystem: assert::QualifierSystem = {
"SystemEntities" => assert::QualifierSystem::Entities,
"SystemContext" => assert::QualifierSystem::Context,
}
// AssertBinaryPrefix: assert::Binary = {
// "substr" => assert::Binary::SubStr,
// "min" => assert::Binary::Min,
// "max" => assert::Binary::Max,
// "commonsubstr" => assert::Binary::CommonSubStr,
// }
AssertQualifierLabel: assert::QualifierLabel = {
"AvailableEntities" => assert::QualifierLabel::AvailableEntities,
"AllReactants" => assert::QualifierLabel::AllReactants,
"AllInhibitors" => assert::QualifierLabel::AllInhibitors,
<q: AssertQualifierRestricted> => assert::QualifierLabel::Restricted(q),
}
// AssertQualifierSystem: assert::QualifierSystem = {
// "SystemEntities" => assert::QualifierSystem::Entities,
// "SystemContext" => assert::QualifierSystem::Context,
// }
AssertQualifierRestricted: assert::QualifierRestricted = {
"Entities" => assert::QualifierRestricted::Entities,
"Context" => assert::QualifierRestricted::Context,
"Reactants" => assert::QualifierRestricted::Reactants,
"ReactantsAbsent" => assert::QualifierRestricted::ReactantsAbsent,
"Inhibitors" => assert::QualifierRestricted::Inhibitors,
"InhibitorsPresent" => assert::QualifierRestricted::InhibitorsPresent,
"Products" => assert::QualifierRestricted::Products,
}
// AssertQualifierLabel: assert::QualifierLabel = {
// "AvailableEntities" => assert::QualifierLabel::AvailableEntities,
// "AllReactants" => assert::QualifierLabel::AllReactants,
// "AllInhibitors" => assert::QualifierLabel::AllInhibitors,
// <q: AssertQualifierRestricted> => assert::QualifierLabel::Restricted(q),
// }
AssertLabel: RSlabel = {
"["
"Entities" ":" <e: Set_of_entities> ","
"Context" ":" <c: Set_of_entities> ","
"Reactants" ":" <r: Set_of_entities> ","
"ReactantsAbsent" ":" <r_a: Set_of_entities> ","
"Inhibitors" ":" <i: Set_of_entities> ","
"InhibitorsPresent" ":" <i_p: Set_of_entities> ","
"Products" ":" <p: Set_of_entities> ","
"]" => RSlabel::create(e, c, r, r_a, i, i_p, p)
}
// AssertQualifierRestricted: assert::QualifierRestricted = {
// "Entities" => assert::QualifierRestricted::Entities,
// "Context" => assert::QualifierRestricted::Context,
// "Reactants" => assert::QualifierRestricted::Reactants,
// "ReactantsAbsent" => assert::QualifierRestricted::ReactantsAbsent,
// "Inhibitors" => assert::QualifierRestricted::Inhibitors,
// "InhibitorsPresent" => assert::QualifierRestricted::InhibitorsPresent,
// "Products" => assert::QualifierRestricted::Products,
// }
AssertRange: assert::Range = {
"{" <e: AssertExpression> "}" => assert::Range::IterateOverSet(Box::new(e)),
"{" <e1: AssertExpression> ".." <e2: AssertExpression> "}" =>
assert::Range::IterateInRange(Box::new(e1), Box::new(e2)),
}
// AssertLabel: RSlabel = {
// "["
// "Entities" ":" <e: Set_of_entities> ","
// "Context" ":" <c: Set_of_entities> ","
// "Reactants" ":" <r: Set_of_entities> ","
// "ReactantsAbsent" ":" <r_a: Set_of_entities> ","
// "Inhibitors" ":" <i: Set_of_entities> ","
// "InhibitorsPresent" ":" <i_p: Set_of_entities> ","
// "Products" ":" <p: Set_of_entities> ","
// "]" => RSlabel::create(e, c, r, r_a, i, i_p, p)
// }
// AssertRange: assert::Range = {
// "{" <e: AssertExpression> "}" => assert::Range::IterateOverSet(Box::new(e)),
// "{" <e1: AssertExpression> ".." <e2: AssertExpression> "}" =>
// assert::Range::IterateInRange(Box::new(e1), Box::new(e2)),
// }
// -----------------------------------------------------------------------------
@ -727,9 +737,16 @@ Instruction: presets::Instruction = {
presets::Instruction::FastFrequency { experiment: p, so },
"Digraph" ">" <gso: Separated_Or<GraphSaveOptions, "|">> =>
presets::Instruction::Digraph { gso },
"Bisimilarity" "(" <p: Path> ")" "relabel" <edge_relabeler: Assert>
// <edge_relabeler: Assert>
"Bisimilarity" "(" <p: Path> ")" "relabel"
">" <so: SaveOptions> =>
presets::Instruction::Bisimilarity { system_b: p, edge_relabeler, so },
presets::Instruction::Bisimilarity {
system_b: p,
edge_relabeler: Box::new(assert::RSassert {
tree: assert::Tree::Return(Box::new(assert::Expression::True))
}),
so
},
}
pub Run: presets::Instructions = {