X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=lexer%2Fmain.c;h=19fc34f8763db78ec958d8d31b7d4e656090b0c8;hb=28280a4c443c55a4e1689a151e5ca2cdf699b184;hp=671d88f94286139bee7cd87159b149312c0e92c2;hpb=4b580abd19143650b3e78d6ffbbb38c333570e5c;p=TP_AL_C.git diff --git a/lexer/main.c b/lexer/main.c index 671d88f..19fc34f 100644 --- a/lexer/main.c +++ b/lexer/main.c @@ -3,10 +3,13 @@ #include #include -FILE *source, *target = NULL; +#define TOKEN_MAX_LENGTH 50 +#define TOKEN_LIST_MAX 500 + +FILE *source = NULL, *target = NULL; char c; unsigned int i = 0; -char tokenValue[50]; +char tokenValue[TOKEN_MAX_LENGTH]; enum TokenType { MOTCLE, SECTION, @@ -16,7 +19,9 @@ enum TokenType { FIN } tokenType; const char* tokenTypestr[] = { "MOTCLE", "SECTION", "SSECTION", "NPARA", "MOT", "FIN" }; +const char* tokenList[TOKEN_LIST_MAX]; +/* It looks silly to check for each characters but for debugging, it's just the way to go */ bool istAlpha() { if (c == 'a' || c == 'b' || c == 'c' || c == 'd' || c == 'e' || c == 'f' || c == 'g' || \ c == 'h' || c == 'i' || c == 'j' || c == 'k' || c == 'l' || c == 'm' || c == 'n' || \ @@ -43,9 +48,9 @@ bool isSeparator() { } int scanner() { -const char* Titre = "Titre"; -const char* Auteur = "Auteur"; -unsigned int j = 0; + const char* Titre = "Titre"; + const char* Auteur = "Auteur"; + unsigned int j = 0; // The main loop get the next character init: @@ -55,6 +60,12 @@ init: i++; goto init; } + if (c == '\n') { + c = fgetc(source); + tokenValue[i] = c; + i++; + goto initLV1; + } if (c == '>') { c = fgetc(source); tokenValue[i] = c; @@ -73,12 +84,6 @@ init: i++; goto M1; } - if (c == '\n') { - c = fgetc(source); - tokenValue[i] = c; - i++; - goto initLV1; - } if (c == EOF) { goto FIN; } else { @@ -86,6 +91,7 @@ init: } MC1: + // FIXME: Partial match need a rewind in the characters extraction from the file if (c == Titre[j] && j < strlen(Titre) - 1) { c = fgetc(source); tokenValue[i] = c; @@ -107,25 +113,29 @@ MC1: } S1SS1: - if (isSeparator() || c == EOF) { - goto SECTION; - } if (c == '=') { c = fgetc(source); tokenValue[i] = c; i++; goto SS2; } + if (isSeparator() || c == EOF) { + goto SECTION; + } SS2: if (isSeparator() || c == EOF) { - goto SECTION; + goto SSECTION; } SECTION: tokenType = SECTION; return 1; +SSECTION: + tokenType = SSECTION; + return 1; + M1: if (istAlpha()) { c = fgetc(source); @@ -138,12 +148,18 @@ M1: } initLV1: - if (c == '\n' || c == '\t') { + if (c == ' ' || c == '\t') { c = fgetc(source); tokenValue[i] = c; i++; goto initLV1; } + if (c == '\n') { + c = fgetc(source); + tokenValue[i] = c; + i++; + goto initLV1LV2; + } if (istAlpha()) { c = fgetc(source); tokenValue[i] = c; @@ -162,12 +178,6 @@ initLV1: i++; goto MC1; } - if (c == '\n') { - c = fgetc(source); - tokenValue[i] = c; - i++; - goto initLV1LV2; - } if (c == EOF) { goto FIN; } @@ -179,6 +189,9 @@ initLV1LV2: i++; goto initLV1LV2; } + if (istAlpha()) { + goto NPARA; + } if (c == '>') { c = fgetc(source); tokenValue[i] = c; @@ -194,9 +207,6 @@ initLV1LV2: if (c == EOF) { goto FIN; } - if (istAlpha()) { - goto NPARA; - } NPARA: tokenType = NPARA; @@ -242,9 +252,10 @@ int main (int argc, char const *argv[]) { return -1; } + int tokenFound = 0; + do { c = fgetc(source); // lecture du caractere suivant du fichier source - //fputc(c, target); // ecrire c dans le fichier target tokenValue[i] = c; i++; int scanrt = scanner(); @@ -257,10 +268,12 @@ int main (int argc, char const *argv[]) { } else { printf ("Token type found: %s\n", tokenTypestr[tokenType]); } - // reinit + tokenList[tokenFound] = tokenTypestr[tokenType]; + tokenFound++; + // reinit tokenValue i = 0; memset(tokenValue, 0, sizeof(tokenValue)); - } while (c != EOF); // tant que la fin du fichier n'est pas atteinte + } while (c != EOF); // tant que la fin du fichier n'est pas atteinte if (source != NULL) fclose(source); // fermeture du fichier source if (target != NULL) fclose(target); // fermeture du fichier target