texte calcul fix
This commit is contained in:
parent
16e1bfb0d6
commit
1fe024e9ff
|
@ -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":[]}]}
|
|
@ -72,9 +72,9 @@ impl fmt::Display for Commande {
|
||||||
impl fmt::Display for Element {
|
impl fmt::Display for Element {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {//'
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {//'
|
||||||
match self {
|
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::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::Variable(nom, type_variable) => write!(f, "{}:{}", nom, type_variable.nom()),
|
||||||
Self::Operateur(operateur) => write!(f, "{}", operateur),
|
Self::Operateur(operateur) => write!(f, "{}", operateur),
|
||||||
Self::Comparaison(comparaison) => write!(f, "{}.", comparaison),
|
Self::Comparaison(comparaison) => write!(f, "{}.", comparaison),
|
||||||
|
@ -103,12 +103,12 @@ impl fmt::Display for Comparaison {
|
||||||
impl fmt::Display for TypeComparaison {
|
impl fmt::Display for TypeComparaison {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {//'
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {//'
|
||||||
match self {
|
match self {
|
||||||
Self::Egal => write!(f, "=="),
|
Self::Egal => write!(f, "égal à"),
|
||||||
Self::Different => write!(f, "!="),
|
Self::Different => write!(f, "différent de"),
|
||||||
Self::SuperieurEgal => write!(f, ">="),
|
Self::SuperieurEgal => write!(f, "supérieur ou égal à"),
|
||||||
Self::InferieurEgal => write!(f, "<="),
|
Self::InferieurEgal => write!(f, "inférieur ou égal à"),
|
||||||
Self::Superieur => write!(f, ">"),
|
Self::Superieur => write!(f, "supérieur à"),
|
||||||
Self::Inferieur => write!(f, "<"),
|
Self::Inferieur => write!(f, "inférieur à"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,13 @@ impl Pendragon {
|
||||||
let mut pile_operateurs: Vec<Operateur> = Vec::new();
|
let mut pile_operateurs: Vec<Operateur> = Vec::new();
|
||||||
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 {
|
||||||
"plus" => {
|
"plus" => {
|
||||||
while let Some(operateur) = pile_operateurs.last() {
|
while let Some(operateur) = pile_operateurs.last() {
|
||||||
|
@ -61,14 +67,14 @@ impl Pendragon {
|
||||||
}
|
}
|
||||||
"ouvre-la-parenthese" => {
|
"ouvre-la-parenthese" => {
|
||||||
if !precede_par_operation {
|
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);
|
pile_operateurs.push(Operateur::ParentheseEntier);
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
"ferme-la-parenthese" => {
|
"ferme-la-parenthese" => {
|
||||||
if precede_par_operation {
|
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() {
|
while let Some(operateur) = pile_operateurs.pop() {
|
||||||
if operateur == Operateur::ParentheseEntier {
|
if operateur == Operateur::ParentheseEntier {
|
||||||
|
@ -80,7 +86,7 @@ impl Pendragon {
|
||||||
}
|
}
|
||||||
autre => {
|
autre => {
|
||||||
if !precede_par_operation {
|
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;
|
precede_par_operation = false;
|
||||||
if format_de_variable(autre) {
|
if format_de_variable(autre) {
|
||||||
|
@ -93,7 +99,7 @@ impl Pendragon {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if precede_par_operation {
|
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;
|
precede_par_operation = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,7 @@ impl Pendragon {
|
||||||
if pile_inconnu.len() == 1 && format_de_variable(premier_element) {
|
if pile_inconnu.len() == 1 && format_de_variable(premier_element) {
|
||||||
expression.push(Element::Variable(premier_element.into(), self.programme.variable(premier_element)?));
|
expression.push(Element::Variable(premier_element.into(), self.programme.variable(premier_element)?));
|
||||||
*pile_inconnu = Vec::new();
|
*pile_inconnu = Vec::new();
|
||||||
|
expression.push(Element::Operateur(Operateur::Puis));
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
let Err(raison) = self.elements_nombre(premier_element) else {
|
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() {
|
if let TypeElement::Booleen = element_pile.type_element() {
|
||||||
texte += &booleen::affiche_booleen(pile.clone(), variables)?;
|
texte += &booleen::affiche_booleen(pile.clone(), variables)?;
|
||||||
|
pile = Vec::new();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if let TypeElement::Entier = element_pile.type_element() {
|
if let TypeElement::Entier = element_pile.type_element() {
|
||||||
texte += &nombre::affiche_nombre(pile.clone(), variables)?;
|
texte += &nombre::affiche_nombre(pile.clone(), variables)?;
|
||||||
|
pile = Vec::new();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
match element_pile {
|
match element_pile {
|
||||||
|
@ -142,14 +145,14 @@ mod test {
|
||||||
let a = 2345678;
|
let a = 2345678;
|
||||||
let b = 987654;
|
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(a),
|
||||||
nombre::nombre_comme_texte(b)));
|
nombre::nombre_comme_texte(b)));
|
||||||
match possible_expression {
|
match possible_expression {
|
||||||
Ok(expression) => {
|
Ok(expression) => {
|
||||||
match calcule_texte(expression, &HashMap::new()) {
|
match calcule_texte(expression, &HashMap::new()) {
|
||||||
Ok(texte) => {
|
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);
|
assert_eq!(texte, vrai_texte, "Calcul d'expression (texte) donne un mauvais résultat : {}", texte);
|
||||||
}
|
}
|
||||||
Err(raison) => {
|
Err(raison) => {
|
||||||
|
|
5
test.dr
5
test.dr
|
@ -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).
|
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.
|
Définis Bool comme booléen.
|
||||||
Modifie Bool avec vrai.
|
Modifie Bool avec vrai.
|
||||||
Affiche vrai et faux.
|
Affiche vrai et faux.
|
||||||
|
|
||||||
|
Affiche trois plus un.
|
Loading…
Reference in a new issue