texte calcul fix

This commit is contained in:
WanderingPenwing 2024-12-12 18:07:58 +01:00
parent 16e1bfb0d6
commit 1fe024e9ff
5 changed files with 29 additions and 17 deletions

View file

@ -1 +1 @@
{"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":[]}]}
{"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":"pour numero de ligne execution","description":"sauvegarde numero de ligne dans la commande\n\ncommande.ligne(12)","id":3}]},{"name":"+","content":[]}]}

View file

@ -72,9 +72,9 @@ impl fmt::Display for Commande {
impl fmt::Display for Element {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {//'
match self {
Self::Entier(nombre) => write!(f, "{}", nombre),
Self::Entier(nombre) => write!(f, "{}", nombre::nombre_comme_texte(*nombre)),
Self::Texte(texte) => write!(f, "\"{}\"", texte),
Self::Booleen(booleen) => write!(f, "{}", booleen),
Self::Booleen(booleen) => write!(f, "{}", booleen::booleen_comme_texte(*booleen)),
Self::Variable(nom, type_variable) => write!(f, "{}:{}", nom, type_variable.nom()),
Self::Operateur(operateur) => write!(f, "{}", operateur),
Self::Comparaison(comparaison) => write!(f, "{}.", comparaison),
@ -103,12 +103,12 @@ impl fmt::Display for Comparaison {
impl fmt::Display for TypeComparaison {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {//'
match self {
Self::Egal => write!(f, "=="),
Self::Different => write!(f, "!="),
Self::SuperieurEgal => write!(f, ">="),
Self::InferieurEgal => write!(f, "<="),
Self::Superieur => write!(f, ">"),
Self::Inferieur => write!(f, "<"),
Self::Egal => write!(f, "égal à"),
Self::Different => write!(f, "différent de"),
Self::SuperieurEgal => write!(f, "supérieur ou égal à"),
Self::InferieurEgal => write!(f, "inférieur ou égal à"),
Self::Superieur => write!(f, "supérieur à"),
Self::Inferieur => write!(f, "inférieur à"),
}
}
}

View file

@ -17,7 +17,13 @@ impl Pendragon {
let mut pile_operateurs: Vec<Operateur> = Vec::new();
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 {
"plus" => {
while let Some(operateur) = pile_operateurs.last() {
@ -61,14 +67,14 @@ impl Pendragon {
}
"ouvre-la-parenthese" => {
if !precede_par_operation {
return Err(ErreurPendragon::CalculEntier("il manque un opérateur avant l'ouverture de parenthèse".into()))
return Err(ErreurPendragon::CalculEntier(format!("il manque un opérateur entre '{}' l'ouverture de parenthèse", element_precedent)))
}
pile_operateurs.push(Operateur::ParentheseEntier);
continue
}
"ferme-la-parenthese" => {
if precede_par_operation {
return Err(ErreurPendragon::CalculEntier("il manque un nombre avant la fermeture de parenthèse".into()))
return Err(ErreurPendragon::CalculEntier(format!("il manque un nombre entre '{}' et la fermeture de parenthèse", element_precedent)))
}
while let Some(operateur) = pile_operateurs.pop() {
if operateur == Operateur::ParentheseEntier {
@ -80,7 +86,7 @@ impl Pendragon {
}
autre => {
if !precede_par_operation {
return Err(ErreurPendragon::CalculEntier(format!("il manque un opérateur avant le nombre '{}'", autre)))
return Err(ErreurPendragon::CalculEntier(format!("il manque un opérateur entre '{}' et '{}'", element_precedent, autre)))
}
precede_par_operation = false;
if format_de_variable(autre) {
@ -93,7 +99,7 @@ impl Pendragon {
}
}
if precede_par_operation {
return Err(ErreurPendragon::CalculEntier(format!("il manque un nombre avant l'opérateur '{}'", element)))
return Err(ErreurPendragon::CalculEntier(format!("il manque un nombre entre '{}' et '{}'", element_precedent, element)))
}
precede_par_operation = true;
}

View file

@ -58,6 +58,7 @@ impl Pendragon {
if pile_inconnu.len() == 1 && format_de_variable(premier_element) {
expression.push(Element::Variable(premier_element.into(), self.programme.variable(premier_element)?));
*pile_inconnu = Vec::new();
expression.push(Element::Operateur(Operateur::Puis));
return Ok(());
}
let Err(raison) = self.elements_nombre(premier_element) else {
@ -100,10 +101,12 @@ pub fn calcule_texte(expression: Vec<Element>, variables: &HashMap<String, Eleme
};
if let TypeElement::Booleen = element_pile.type_element() {
texte += &booleen::affiche_booleen(pile.clone(), variables)?;
pile = Vec::new();
continue;
}
if let TypeElement::Entier = element_pile.type_element() {
texte += &nombre::affiche_nombre(pile.clone(), variables)?;
pile = Vec::new();
continue;
}
match element_pile {
@ -142,14 +145,14 @@ mod test {
let a = 2345678;
let b = 987654;
let possible_expression = pendragon.elements_texte(&format!("\"hello\" puis {} fois {} puis \"there\" puis vrai ou faux",
let possible_expression = pendragon.elements_texte(&format!("\"hello\" puis {} fois {} puis \"there\" puis vrai ou faux puis trois puis deux",
nombre::nombre_comme_texte(a),
nombre::nombre_comme_texte(b)));
match possible_expression {
Ok(expression) => {
match calcule_texte(expression, &HashMap::new()) {
Ok(texte) => {
let vrai_texte = format!("hello{}therevrai", nombre::nombre_comme_texte(a*b));
let vrai_texte = format!("hello{}therevraitroisdeux", nombre::nombre_comme_texte(a*b));
assert_eq!(texte, vrai_texte, "Calcul d'expression (texte) donne un mauvais résultat : {}", texte);
}
Err(raison) => {

View file

@ -9,8 +9,11 @@ Modifie B avec trois fois A fois ouvre la parenthèse trois fois A plus C ferme
Nota Bene : 3*A*(3*A+C).
Affiche "Résultat : " puis B.
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.
Affiche trois plus un.