From 430491e125364c3f65923b3a5bd37d90cd3eff78 Mon Sep 17 00:00:00 2001 From: primardj Date: Sun, 14 Jan 2024 19:12:44 +0000 Subject: [PATCH] =?UTF-8?q?ajout=20du=20constructeur=20Structure=20vide=20?= =?UTF-8?q?terminaision=20de=20la=20fonction=20parse2=20et=20cr=C3=A9ation?= =?UTF-8?q?=20de=20la=20fonction=20parse=5Finitial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/objects/structure.rs | 7 +++++++ src/parser.rs | 44 +++++++++++++++++++++++++++++++++++----- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/objects/structure.rs b/src/objects/structure.rs index ef5bc42..b5f163b 100644 --- a/src/objects/structure.rs +++ b/src/objects/structure.rs @@ -76,6 +76,13 @@ impl Structure { contents: cont, } } + pub fn empty() -> Self { + Self { + name: String::new(), + contents: Vec::new(), + } + } + pub fn get_name(&self) -> &String { &self.name } diff --git a/src/parser.rs b/src/parser.rs index f4d48f0..5bff351 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -4,6 +4,7 @@ // parse2(command_line: &String) -> Entree use crate::objects::entree::Entree; +use crate::objects::structure::Structure; fn parse_after_whitespace(char_splitted_command_line: &mut Vec, argv: &mut Vec) -> Vec { @@ -41,6 +42,7 @@ fn parse_initial_state(char_splitted_command_line: &mut Vec, current_arg: } fn split_string_in_chars(string_to_split: &String) -> Vec { + // découpe une chaine de caractère &String en Vec Vec { // Up to this line is the old version parser. +fn parse_initial(entree: Entree, restant_a_parser: Vec, stack_last_quote: Vec, last_word: String, struct_in_construct: Structure) -> Entree { + // Est le parseur initial, comence ca recursivitée avec une entree vide, une ligne de command + // 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. + // + // Tout dabord, regarde que la pile des quotes est vide, sinon, mettre le caractère dans + // last_word sauf si c la dernière quote entré dans ce cas enlever la quote de la pile et + // parser last_word + // + // si la pile de quote est vide, regarde si le caractère est '\n' ou ';' dans ce cas la, si + // last_word et Structure sont vide, passer au caractère suivant, sinon si Structure et + // last_word ne sont pas vide alors si structure est vide, parser last_word, et ajouter la + // structure ressortie à entree, si last_word est vide et structure non vide, ajouter + // directement structure à entree. + // + // Fais appel à la fonction parser_word pour déterminer si le dernier mot entré est une + // commande, une variable, un pipe ou une structure de control lol. Retourne une structure du + // meme type que last_word, avec last_word au début de ses contents. + + // TODO + entree +} pub fn parse2(command_line: &String) -> Entree { // prends en paramettre un ligne de commande, et retourne une Entree. - let mut jaaj: Entree = Entree::new(); + let mut entree: Entree = Entree::new(); // Je vais fortement m'inspirer de ce qu'as fait hippolyte dans sa version de parser. - // Tout dabord, je vais couper ma chaine en caractères. - // puis, je vais appeler une fonction recursive qui vas faire comme ceci: + // je vais appeler une fonction recursive qui vas faire comme ceci: // - // parser_initial(entree: &mut Entree, Restant_à_parser: &mut Vec, stack_last_quote: &mut Vec, last_word: &mut String, struct_in_construct: &mut Structure) + // parser_initial(entree: Entree, Restant_à_parser: Vec, stack_last_quote: Vec, last_word: String, struct_in_construct: Structure) // { si Restant_à_parser.pop() == ';' et stack_last_quote.len() == 0 et // struct_in_construct == None et last_word == None => Rien faire // { si Restant_à_parser.pop() == ';' et stack_last_quote.len() == 0 et @@ -79,5 +103,15 @@ pub fn parse2(command_line: &String) -> Entree { // entree.add_structure(struct_in_construct); struct_in_construct = None // { // - jaaj + + // Etape 0, découper la commande_line: &String en command_line: Vec + let mut char_splitted_command_line: Vec = split_string_in_chars(&command_line); + + // Etape 1, préparer les variables pour lancer le parser recursif + let mut stack_char_empty: Vec = Vec::new(); + let mut empty_word: String = String::new(); + + // Etape 2, lancer le parser recursif. Il retournera une Entree bien parsé comme il faut. + parse_initial( entree, char_splitted_command_line, stack_char_empty, empty_word, Structure::empty()) + }