From 787063f4b7a7495db5a98b40d0495a043b2adc9b Mon Sep 17 00:00:00 2001 From: primardj Date: Thu, 18 Jan 2024 14:46:44 +0000 Subject: [PATCH] add quote gestion --- src/parser.rs | 50 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index 00f892a..5b8175b 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -117,23 +117,59 @@ fn parse_cas_fin_de_chaine(mut entree: Entree, stack_last_quote: Vec, last } -fn parse_recursif(mut entree: Entree, mut restant_a_parser: Vec, stack_last_quote: Vec, last_word: String, mut struct_in_construct: Structure) -> Entree { +fn parse_recursif(mut entree: Entree, mut restant_a_parser: Vec, mut stack_last_quote: Vec, mut last_word: String, mut struct_in_construct: Structure) -> Entree { // Est le parseur initial, commence sa recursivitée avec une entree vide, une ligne de commande // en char, une pile vide, un mot vide, et une structure vide. // // Lis les caractères un par un, et détermine l'action à prendre avec chaques caractères. // Etape 0; Lis le premier caractère de ce qu'il reste à parser. - let current_char = restant_a_parser.pop(); + let current_char_option = restant_a_parser.pop(); // Etape 1, test cas ou la chaine est vide 'Cas final' - if current_char.is_none() { + if current_char_option.is_none() { parse_cas_fin_de_chaine(entree, stack_last_quote, last_word, struct_in_construct) } else { - // Etape 2, regarde si la stack des quotes est vide, sinon regarder si la quote c la - // last_quote dans stack_last_quote cas oui, parser last_word, cas non, ajoutter caractère - // à last_word. et relancer le parser_recursif + let current_char = current_char_option.expect("current_char_is_None"); + // Etape 2, regarde si il y as des quotes dans la stack des quotes si oui regarder quel est + // cette quote, et executer en fonction de cela la bonne fonction. + if stack_last_quote[stack_last_quote.len()-1] == '\'' { + // cas ou le quote est ' peu importe le caractère lus autre que ' le mettre dans + // last_word et rappeler parse_recursif. + if current_char == '\'' { + let _ = stack_last_quote.pop(); + parse_recursif(entree, restant_a_parser, stack_last_quote, last_word, struct_in_construct) + } else { + last_word.push(current_char); + parse_recursif(entree, restant_a_parser, stack_last_quote, last_word, struct_in_construct) + } + } else if stack_last_quote[stack_last_quote.len()-1] == '"' { + // cas ou quote est " parser caractère sauf si " + // ce cas existe pour au moment ou on rajoutteras la compatibilitée des variables. + if current_char == '"' { + let _ = stack_last_quote.pop(); + parse_recursif(entree, restant_a_parser, stack_last_quote, last_word, struct_in_construct) + } else { + last_word.push(current_char); + parse_recursif(entree, restant_a_parser, stack_last_quote, last_word, struct_in_construct) + } + } else { + // maintenant que la stack des quote est vide, regardons si le dernier caractère entré + // est une quote. + if current_char == '"' || current_char == '\'' { + // dans ce cas la, l'ajoutter à la stack + stack_last_quote.push(current_char); + parse_recursif(entree, restant_a_parser, stack_last_quote, last_word, struct_in_construct) + } else if current_char == ';' { + // regardons si c'est le ; caractère de fin de ligne. + // TODO + entree + } else { + // TODO + entree + } + } // // Si oui, vérif ';' // Cas last_word et Structure vide, ignorer le caractère et rappeler le parser_recursif @@ -146,7 +182,7 @@ fn parse_recursif(mut entree: Entree, mut restant_a_parser: Vec, stack_las // pour tout les autres cas, ajouter char à last_word. // TODO - entree // Ici faudra rappeler le parse_recursif pour passer au caractère suivant. + //entree // Ici faudra rappeler le parse_recursif pour passer au caractère suivant. } }