better number and boolean in text error
This commit is contained in:
parent
9032e00b72
commit
16e1bfb0d6
|
@ -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":[]}]}
|
|
@ -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",
|
||||||
|
|
|
@ -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);
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue