X-Git-Url: https://git.piment-noir.org/?p=TP_AL_C.git;a=blobdiff_plain;f=lexer%2Fmain.c;h=f2b6df47660f77bb7c43c49b4752a7ea52582966;hp=bb3c6aea0588433425d39213380b64571191fd5b;hb=f8c1adc17ee4b1e87981568009a92d84bf0f5506;hpb=96964f3e029ca573f98bff48e932b33367ec5e75 diff --git a/lexer/main.c b/lexer/main.c index bb3c6ae..f2b6df4 100644 --- a/lexer/main.c +++ b/lexer/main.c @@ -1,36 +1,135 @@ #include #include #include +#include +#include -FILE *source, *target = NULL; -char c; +#include "global_vars.h" +#include "lexical_analyzer.h" +#include "syntactic_analyzer.h" +#include "print_helper.h" -int main (int argc, char const *argv[]) { +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); +} - // Ouvre le fichier test.txt en lecture seulement (le fichier doit exister) : - source = fopen("test.txt", "r"); - // Cree et ouvre un fichier target.html en lecture/ecriture - // avec suppression du contenu au prealable : - target = fopen("target.html", "w+"); +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 (source == NULL) { - printf("Impossible d'ouvrir le fichier source\n"); - return -1; + 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 (target == NULL) { - printf("Impossible d'ouvrir le fichier target\n"); - return -1; + 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; } - c = fgetc(source); // lecture du caractere suivant du fichier source - while(c != EOF) { // tant que la fin du fichier n'est pas atteinte - fputc(c, target); // ecrire c dans le fichier target - c = fgetc(source); // lecture du caractere suivant du fichier source + 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 0; + return EXIT_SUCCESS; }