better number and boolean in text error

This commit is contained in:
WanderingPenwing 2024-12-12 15:46:15 +01:00
parent 9032e00b72
commit 16e1bfb0d6
5 changed files with 50 additions and 22 deletions

View file

@ -1 +1 @@
{"categories":[{"name":"todo","content":[{"name":"erreur calcul bool/nombre","description":"affiche element precedent lorsque mauvais enchainement","id":1},{"name":"display element","description":"for better print","id":6},{"name":"if","description":"implémente if avec des guillemets de délimitation","id":1},{"name":"scope variable","description":"// Hello there","id":6},{"name":"while","description":"implémente un while","id":2},{"name":"else","description":"// Hello there","id":7},{"name":"break","description":"// Hello there","id":8},{"name":"continue","description":"// Hello there","id":9},{"name":"compilation","description":"// Hello there","id":3},{"name":"puis à la ligne, alinéa","description":"// Hello there","id":1}]},{"name":"in progress","content":[]},{"name":"done","content":[{"name":"comparaison","description":"// Hello there","id":2},{"name":"booleen type","description":"// Hello there","id":4},{"name":"soixante-dix","description":"// Hello there","id":1},{"name":"parenthese comparaison","description":"// Hello there","id":1},{"name":"test comparaison","description":"// Hello there","id":4},{"name":"error ligne compilation","description":"// Hello there","id":2},{"name":"commentaires","description":"// Hello there","id":3},{"name":"compile time verification","description":"odre des termes rpn","id":1},{"name":"test multiple space in texte","description":"// Hello there","id":3},{"name":"test puis in texte","description":"// Hello there","id":2},{"name":"enchainement puis","description":"// Hello there","id":5},{"name":"guillemet mal ferme","description":"// Hello there","id":4}]},{"name":"bug","content":[]},{"name":"to test","content":[{"name":"tests mod","description":"// Hello there","id":3},{"name":"test variable","description":"// Hello there","id":2}]},{"name":"bonus","content":[{"name":"stop cheating with \"-\"","description":"// Hello there","id":5},{"name":"affiche ligne et position erreur","description":"// Hello there","id":1}]},{"name":"+","content":[]}]} {"categories":[{"name":"todo","content":[{"name":"erreur calcul bool/nombre","description":"affiche element precedent lorsque mauvais enchainement","id":1},{"name":"if","description":"implémente if avec des guillemets de délimitation","id":1},{"name":"scope variable","description":"// Hello there","id":6},{"name":"while","description":"implémente un while","id":2},{"name":"else","description":"// Hello there","id":7},{"name":"break","description":"// Hello there","id":8},{"name":"continue","description":"// Hello there","id":9},{"name":"compilation","description":"// Hello there","id":3},{"name":"puis à la ligne, alinéa","description":"// Hello there","id":1}]},{"name":"in progress","content":[]},{"name":"done","content":[{"name":"comparaison","description":"// Hello there","id":2},{"name":"booleen type","description":"// Hello there","id":4},{"name":"soixante-dix","description":"// Hello there","id":1},{"name":"parenthese comparaison","description":"// Hello there","id":1},{"name":"test comparaison","description":"// Hello there","id":4},{"name":"error ligne compilation","description":"// Hello there","id":2},{"name":"commentaires","description":"// Hello there","id":3},{"name":"compile time verification","description":"odre des termes rpn","id":1},{"name":"test multiple space in texte","description":"// Hello there","id":3},{"name":"test puis in texte","description":"// Hello there","id":2},{"name":"enchainement puis","description":"// Hello there","id":5},{"name":"guillemet mal ferme","description":"// Hello there","id":4},{"name":"display element","description":"for better print","id":6}]},{"name":"bug","content":[]},{"name":"to test","content":[{"name":"tests mod","description":"// Hello there","id":3},{"name":"test variable","description":"// Hello there","id":2}]},{"name":"bonus","content":[{"name":"stop cheating with \"-\"","description":"// Hello there","id":5},{"name":"affiche ligne et position erreur","description":"// Hello there","id":1}]},{"name":"+","content":[]}]}

View file

@ -20,13 +20,19 @@ impl Pendragon {
let mut possible_comparaison: Option<Comparaison> = None; let mut possible_comparaison: Option<Comparaison> = None;
let mut precede_par_operation: bool = true; let mut precede_par_operation: bool = true;
for element in elements_texte { for (index, element) in elements_texte.iter().enumerate() {
let element_precedent = if index > 0 {
elements_texte[index-1]
} else {
"le début"
};
let element: &str = *element;
match element { match element {
"vrai" => { "vrai" => {
self.fin_comparaison("vrai", &mut pile_inconnu, &mut pile_operateurs, &mut expression, &mut possible_comparaison)?; self.fin_comparaison("vrai", &mut pile_inconnu, &mut pile_operateurs, &mut expression, &mut possible_comparaison)?;
expression.push(Element::Booleen(true)); expression.push(Element::Booleen(true));
if !precede_par_operation { if !precede_par_operation {
return Err(ErreurPendragon::CalculBooleen("il manque un opérateur avant le booléen 'vrai'".into())) return Err(ErreurPendragon::CalculBooleen(format!("il manque un opérateur entre '{}' et 'vrai'", element_precedent)))
} }
precede_par_operation = false; precede_par_operation = false;
continue; continue;
@ -35,7 +41,7 @@ impl Pendragon {
self.fin_comparaison("faux", &mut pile_inconnu, &mut pile_operateurs, &mut expression, &mut possible_comparaison)?; self.fin_comparaison("faux", &mut pile_inconnu, &mut pile_operateurs, &mut expression, &mut possible_comparaison)?;
expression.push(Element::Booleen(false)); expression.push(Element::Booleen(false));
if !precede_par_operation { if !precede_par_operation {
return Err(ErreurPendragon::CalculBooleen("il manque un opérateur avant le booléen 'faux'".into())) return Err(ErreurPendragon::CalculBooleen(format!("il manque un opérateur entre '{}' et 'faux'", element_precedent)))
} }
precede_par_operation = false; precede_par_operation = false;
continue; continue;
@ -44,7 +50,7 @@ impl Pendragon {
self.fin_comparaison("non", &mut pile_inconnu, &mut pile_operateurs, &mut expression, &mut possible_comparaison)?; self.fin_comparaison("non", &mut pile_inconnu, &mut pile_operateurs, &mut expression, &mut possible_comparaison)?;
pile_operateurs.push(Operateur::Non); pile_operateurs.push(Operateur::Non);
if !precede_par_operation { if !precede_par_operation {
return Err(ErreurPendragon::CalculBooleen("il manque un opérateur avant l'opérateur 'non'".into())) return Err(ErreurPendragon::CalculBooleen(format!("il manque un opérateur entre '{}' et 'non'", element_precedent)))
} }
continue; continue;
} }
@ -72,14 +78,14 @@ impl Pendragon {
} }
"ouvre-la-parenthese" => { "ouvre-la-parenthese" => {
if !precede_par_operation && pile_inconnu.len() > 0 { if !precede_par_operation && pile_inconnu.len() > 0 {
return Err(ErreurPendragon::CalculBooleen("il manque un opérateur avant l'ouverture de la parenthèse".into())) return Err(ErreurPendragon::CalculBooleen(format!("il manque un opérateur entre '{}' et l'ouverture de la parenthèse", element_precedent)))
} }
pile_inconnu.push("ouvre-la-parenthese".into()); pile_inconnu.push("ouvre-la-parenthese".into());
continue; continue;
} }
"ferme-la-parenthese" => { "ferme-la-parenthese" => {
if precede_par_operation { if precede_par_operation {
return Err(ErreurPendragon::CalculBooleen("il manque un booleen avant la fermeture de la parenthèse".into())) return Err(ErreurPendragon::CalculBooleen(format!("il manque un booleen entre '{}' et la fermeture de la parenthèse", element_precedent)))
} }
let nombre_parenthese = compare_parentheses(&pile_inconnu); let nombre_parenthese = compare_parentheses(&pile_inconnu);
if nombre_parenthese.0 > nombre_parenthese.1 { if nombre_parenthese.0 > nombre_parenthese.1 {
@ -105,7 +111,7 @@ impl Pendragon {
} }
} else if let Ok(type_comparaison) = texte_comme_comparaison(autre) { } else if let Ok(type_comparaison) = texte_comme_comparaison(autre) {
if let Some(comparaison) = possible_comparaison { if let Some(comparaison) = possible_comparaison {
return Err(ErreurPendragon::BooleenInvalide(format!("besoin d'un operateur booleen entre {} et {}", comparaison, type_comparaison))) return Err(ErreurPendragon::BooleenInvalide(format!("il manque un operateur booleen entre '{}' et '{}'", comparaison, type_comparaison)))
} }
let mut comparaison = Comparaison::nouvelle(); let mut comparaison = Comparaison::nouvelle();
let nombre_parenthese = compare_parentheses(&pile_inconnu); let nombre_parenthese = compare_parentheses(&pile_inconnu);
@ -120,15 +126,12 @@ impl Pendragon {
} else { } else {
pile_inconnu.push(autre.into()); pile_inconnu.push(autre.into());
} }
// if !precede_par_operation {
// return Err(ErreurPendragon::CalculBooleen(format!("il manque un opérateur avant le booléen '{}'", autre)))
// }
precede_par_operation = false; precede_par_operation = false;
continue; continue;
} }
} }
if precede_par_operation { if precede_par_operation {
return Err(ErreurPendragon::CalculBooleen(format!("il manque un booleen avant l'opérateur '{}'", element))) return Err(ErreurPendragon::CalculBooleen(format!("il manque un booleen entre '{}' et '{}'", element_precedent, element)))
} }
precede_par_operation = true; precede_par_operation = true;
} }
@ -406,7 +409,6 @@ mod test {
for c in 0..5 { for c in 0..5 {
for d in 1..5 { for d in 1..5 {
for e in 0..5 { for e in 0..5 {
println!();
let possible_expression = pendragon.elements_booleen(&format!("non ouvre la parenthèse six plus {} ferme la parenthèse est supérieur à deux fois {} et ouvre la parenthèse {} divisé par deux est inférieur à ouvre la parenthèse {} moins un ferme la parenthèse ou non \"deux\" est égal à \"{}\" ferme la parenthèse", let possible_expression = pendragon.elements_booleen(&format!("non ouvre la parenthèse six plus {} ferme la parenthèse est supérieur à deux fois {} et ouvre la parenthèse {} divisé par deux est inférieur à ouvre la parenthèse {} moins un ferme la parenthèse ou non \"deux\" est égal à \"{}\" ferme la parenthèse",
nombre::nombre_comme_texte(a), nombre::nombre_comme_texte(a),
nombre::nombre_comme_texte(b), nombre::nombre_comme_texte(b),
@ -441,6 +443,7 @@ mod test {
fn erreur_calcul_booleen() { fn erreur_calcul_booleen() {
let pendragon = Pendragon::nouveau(); let pendragon = Pendragon::nouveau();
let textes_invalide = vec![ let textes_invalide = vec![
"et faux",
"vrai et et faux", "vrai et et faux",
"vrai ou ou faux", "vrai ou ou faux",
"vrai et vrai faux", "vrai et vrai faux",

View file

@ -299,6 +299,10 @@ pub fn texte_comme_nombre(texte: &str) -> Result<Element, ErreurPendragon> {
} }
fn texte_comme_petit_nombre(texte: &str) -> Result<usize, ErreurPendragon> { fn texte_comme_petit_nombre(texte: &str) -> Result<usize, ErreurPendragon> {
let texte = texte.trim();
if texte.starts_with("et") || texte.ends_with("et") {
return Err(ErreurPendragon::NombreInvalide(texte.to_string()))
}
let elements: Vec<&str> = texte.split(UNION).collect(); let elements: Vec<&str> = texte.split(UNION).collect();
let mut nombre = 0; let mut nombre = 0;
@ -435,4 +439,15 @@ mod test {
}; };
} }
} }
#[test]
fn nombre_invalide_et() {
let pendragon = Pendragon::nouveau();
let Err(raison) = pendragon.elements_nombre("et") else {
panic!("Devrait détecter une erreur pour 'et'");
};
let ErreurPendragon::NombreInvalide(_) = raison else {
panic!("Devrait détecter une erreur de nombre invalide pour 'et', a déclenché : {}", raison);
};
}
} }

View file

@ -37,7 +37,6 @@ impl Pendragon {
pile_inconnu.push(element.into()); pile_inconnu.push(element.into());
continue; continue;
} }
self.puis(&mut expression, &mut pile_inconnu)?; self.puis(&mut expression, &mut pile_inconnu)?;
} }
self.puis(&mut expression, &mut pile_inconnu)?; self.puis(&mut expression, &mut pile_inconnu)?;
@ -61,16 +60,25 @@ impl Pendragon {
*pile_inconnu = Vec::new(); *pile_inconnu = Vec::new();
return Ok(()); return Ok(());
} }
if let Ok(_) = self.elements_nombre(premier_element) { let Err(raison) = self.elements_nombre(premier_element) else {
expression.extend(self.elements_nombre(&pile_inconnu.join(" "))?); expression.extend(self.elements_nombre(&pile_inconnu.join(" "))?);
} else if let Ok(_) = self.elements_booleen(premier_element) { *pile_inconnu = Vec::new();
expression.extend(self.elements_booleen(&pile_inconnu.join(" "))?); expression.push(Element::Operateur(Operateur::Puis));
} else { return Ok(())
return Err(ErreurPendragon::MauvaisArgument(pile_inconnu.join(" ").to_string())); };
if let ErreurPendragon::CalculEntier(_) = raison {
return Err(raison)
} }
*pile_inconnu = Vec::new(); let Err(raison) = self.elements_booleen(premier_element) else {
expression.push(Element::Operateur(Operateur::Puis)); expression.extend(self.elements_booleen(&pile_inconnu.join(" "))?);
Ok(()) *pile_inconnu = Vec::new();
expression.push(Element::Operateur(Operateur::Puis));
return Ok(());
};
let ErreurPendragon::CalculBooleen(_) = raison else {
return Err(ErreurPendragon::MauvaisArgument(pile_inconnu.join(" ").to_string()));
};
Err(raison)
} }
} }

View file

@ -11,4 +11,6 @@ Nota Bene : 3*A*(3*A+C).
Affiche "Résultat : " puis B. Affiche "Résultat : " puis B.
Si A supérieur ou égal à trois, Si A supérieur ou égal à trois,
Définis Bool comme booléen.
Modifie Bool avec vrai.
Affiche vrai et faux. Affiche vrai et faux.