X-Git-Url: https://git.piment-noir.org/?p=TP_AL_C.git;a=blobdiff_plain;f=lexer%2Fmain.c;h=f2b6df47660f77bb7c43c49b4752a7ea52582966;hp=8b137891791fe96927ad78e64b0aad7bded08bdc;hb=f8c1adc17ee4b1e87981568009a92d84bf0f5506;hpb=e9a51b682b4e6bc16b469fdf5578a045555479bc diff --git a/lexer/main.c b/lexer/main.c index 8b13789..f2b6df4 100644 --- a/lexer/main.c +++ b/lexer/main.c @@ -1 +1,135 @@ +#include +#include +#include +#include +#include +#include "global_vars.h" +#include "lexical_analyzer.h" +#include "syntactic_analyzer.h" +#include "print_helper.h" + +void do_lexical_analysis() { + c = fgetwc(source); // lecture du premier caractere + do { + scanner(); + wprint_token_target(); + token[tokenFound].type = tokenTypestr[tokenType]; + tokenFound++; + } while (tokenType != FIN); // tant que la fin du fichier n'est pas atteinte +} + +void do_syntactic_analysis() { + fputws(L"\n\n", + target); + c = fgetwc(source); // lecture du premier caractere + analyze_AXIOME(); + fputws(L"\n", target); +} + +void print_usage(const char* name) { + fprintf(stdout,"Usage: %s [options]\n" + "Where [options] are:\n" + " -h, --help: display this help message\n" + " -l, --lexical-only: do only the lexical analysis\n" + " -i, --input: use as input file instead of standard input\n" + " -o, --output: use as output file instead of standard output\n", + name); + fflush(stdout); +} + +int main(int argc, char **argv) { + /* In and out files name */ + const char* in_file = NULL; + const char* out_file = NULL; + static int hflag = 0; + static int lflag = 0; + + /* getopt_long stores the option index here. */ + int option_index = 0; + + static struct option long_options[] = + { + {"help", no_argument, &hflag, 1}, + {"input", optional_argument, NULL, 'i'}, + {"lexical-only", no_argument, &lflag, 1}, + {"output", optional_argument, NULL, 'o'}, + {0, 0, 0, 0} + }; + + int c_in; + + while ((c_in = getopt_long(argc, argv, "hi::lo::", long_options, + &option_index)) != -1) { + switch (c_in) { + case 'h': + hflag = 1; + break; + case 'i': + if (optarg != NULL) { + in_file = optarg; + } + break; + case 'l': + lflag = 1; + break; + case 'o': + if (optarg != NULL) { + out_file = optarg; + } + break; + case 0: + /* getopt_long() set a variable, just keep going */ + break; + case ':': + /* missing option argument */ + pr_error("%s: option '-%c' requires an argument\n", + argv[0], optopt); + break; + case '?': + default: + /* invalid option */ + pr_error("%s: option '-%c' is invalid: ignored\n", + argv[0], optopt); + /* print the help message for invalid options */ + hflag = 1; + break; + } + } + + if (in_file != NULL) { + // Ouvre le fichier source en lecture seulement (le fichier doit exister) : + source = fopen(in_file, "r+"); + if (source == NULL) { + pr_error("Fail to open file %s\n", in_file); + return EXIT_FAILURE; + } + } else { + source = stdin; + } + + if (out_file != NULL) { + // Cree et ouvre le fichier cible en lecture/ecriture + // avec suppression du contenu au prealable : + target = fopen(out_file, "w+"); + if (target == NULL) { + pr_error("Fail to open file %s\n", out_file); + return EXIT_FAILURE; + } + } else { + target = stdout; + } + + if (hflag) { + print_usage(argv[0]); + } else if (lflag) { + do_lexical_analysis(); + } else { + do_syntactic_analysis(); + } + + if (source != NULL) fclose(source); // fermeture du fichier source + if (target != NULL) fclose(target); // fermeture du fichier target + + return EXIT_SUCCESS; +}