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 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 {
|
||||
"vrai" => {
|
||||
self.fin_comparaison("vrai", &mut pile_inconnu, &mut pile_operateurs, &mut expression, &mut possible_comparaison)?;
|
||||
expression.push(Element::Booleen(true));
|
||||
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;
|
||||
continue;
|
||||
|
@ -35,7 +41,7 @@ impl Pendragon {
|
|||
self.fin_comparaison("faux", &mut pile_inconnu, &mut pile_operateurs, &mut expression, &mut possible_comparaison)?;
|
||||
expression.push(Element::Booleen(false));
|
||||
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;
|
||||
continue;
|
||||
|
@ -44,7 +50,7 @@ impl Pendragon {
|
|||
self.fin_comparaison("non", &mut pile_inconnu, &mut pile_operateurs, &mut expression, &mut possible_comparaison)?;
|
||||
pile_operateurs.push(Operateur::Non);
|
||||
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;
|
||||
}
|
||||
|
@ -72,14 +78,14 @@ impl Pendragon {
|
|||
}
|
||||
"ouvre-la-parenthese" => {
|
||||
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());
|
||||
continue;
|
||||
}
|
||||
"ferme-la-parenthese" => {
|
||||
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);
|
||||
if nombre_parenthese.0 > nombre_parenthese.1 {
|
||||
|
@ -105,7 +111,7 @@ impl Pendragon {
|
|||
}
|
||||
} else if let Ok(type_comparaison) = texte_comme_comparaison(autre) {
|
||||
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 nombre_parenthese = compare_parentheses(&pile_inconnu);
|
||||
|
@ -120,15 +126,12 @@ impl Pendragon {
|
|||
} else {
|
||||
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;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
@ -406,7 +409,6 @@ mod test {
|
|||
for c in 0..5 {
|
||||
for d in 1..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",
|
||||
nombre::nombre_comme_texte(a),
|
||||
nombre::nombre_comme_texte(b),
|
||||
|
@ -441,6 +443,7 @@ mod test {
|
|||
fn erreur_calcul_booleen() {
|
||||
let pendragon = Pendragon::nouveau();
|
||||
let textes_invalide = vec![
|
||||
"et faux",
|
||||
"vrai et et faux",
|
||||
"vrai ou ou 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> {
|
||||
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 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());
|
||||
continue;
|
||||
}
|
||||
|
||||
self.puis(&mut expression, &mut pile_inconnu)?;
|
||||
}
|
||||
self.puis(&mut expression, &mut pile_inconnu)?;
|
||||
|
@ -61,16 +60,25 @@ impl Pendragon {
|
|||
*pile_inconnu = Vec::new();
|
||||
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(" "))?);
|
||||
} else if let Ok(_) = self.elements_booleen(premier_element) {
|
||||
expression.extend(self.elements_booleen(&pile_inconnu.join(" "))?);
|
||||
} else {
|
||||
return Err(ErreurPendragon::MauvaisArgument(pile_inconnu.join(" ").to_string()));
|
||||
*pile_inconnu = Vec::new();
|
||||
expression.push(Element::Operateur(Operateur::Puis));
|
||||
return Ok(())
|
||||
};
|
||||
if let ErreurPendragon::CalculEntier(_) = raison {
|
||||
return Err(raison)
|
||||
}
|
||||
*pile_inconnu = Vec::new();
|
||||
expression.push(Element::Operateur(Operateur::Puis));
|
||||
Ok(())
|
||||
let Err(raison) = self.elements_booleen(premier_element) else {
|
||||
expression.extend(self.elements_booleen(&pile_inconnu.join(" "))?);
|
||||
*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