Fix the syntactic analyzer for real.
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 25 Feb 2018 14:58:55 +0000 (15:58 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 25 Feb 2018 14:58:55 +0000 (15:58 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
lexer/global_vars.c
lexer/global_vars.h
lexer/lexical_analyzer.c
lexer/main.c
lexer/print_helper.c
lexer/print_helper.h
lexer/syntactic_analyzer.c

index bec89423968ed30be8997160470da99bcd2f0be6..3128c01779fce5f379796195df04a978ec1d3156 100644 (file)
@@ -2,5 +2,6 @@
 
 FILE *source = NULL, *target = NULL;
 struct token_s token[TOKEN_MAX] = {{NULL, {0}}};
+wint_t tokenValue[50] = {0};
 unsigned int tokenFound = 0;
 const char* tokenTypestr[] = { "MOTCLE", "SECTION", "SSECTION", "NPARA", "MOT", "FIN" };
index 6e7ddeae94acee33c7882bcb3862357c75dc92ea..40eddfb66d1ca1f7f7cf3a45071ea028f937e07b 100644 (file)
@@ -15,6 +15,7 @@ struct token_s {
 extern struct token_s token[TOKEN_MAX];
 
 extern wint_t c;
+extern wint_t tokenValue[50];
 
 extern unsigned int tokenFound;
 extern enum TokenType {
index 56415a01a914f73c8ee3355fada66416d6f10ead..0d6a7284abb35cb064fd40885d980bfb8c9a74f0 100644 (file)
@@ -47,6 +47,7 @@ static bool isEOF() {
 }
 
 int scanner() {
+    tokenValue[0] = 0;
     unsigned int i = 0;
     wchar_t m[6];
 
@@ -69,6 +70,7 @@ init:
     }
     if (isAlphaNum()) {
         token[tokenFound].value[i] = c;
+        tokenValue[i] = c;
         i++;
         c = fgetwc(source);
         goto M1;
@@ -81,11 +83,13 @@ init:
 MC1:
     if (c == L'A' && !wcscmp(fgetws(m, 6, source), L"uteur")) {
         wcscpy((wchar_t*)token[tokenFound].value, L">Auteur");
+        wcscpy((wchar_t*)tokenValue, L">Auteur");
         c = fgetwc(source);
         goto MC2;
     }
     if (c == L'T' && !wcscmp(fgetws(m, 5, source), L"itre")) {
         wcscpy((wchar_t*)token[tokenFound].value, L">Titre");
+        wcscpy((wchar_t*)tokenValue, L">Titre");
         c = fgetwc(source);
         goto MC2;
     }
@@ -118,6 +122,7 @@ SSECTION:
 M1:
     if (isAlphaNum()) {
         token[tokenFound].value[i] = c;
+        tokenValue[i] = c;
         i++;
         c = fgetwc(source);
         goto M1;
@@ -138,6 +143,7 @@ initLV1:
     }
     if (isAlphaNum()) {
         token[tokenFound].value[i] = c;
+        tokenValue[i] = c;
         i++;
         c = fgetwc(source);
         goto M1;
@@ -181,6 +187,8 @@ NPARA:
     return EXIT_SUCCESS;
 
 MOT:
+    token[tokenFound].value[i] = 0;
+    tokenValue[i] = 0;
     tokenType = MOT;
     return EXIT_SUCCESS;
 
index 7c31ee37aa388dd52629cc95f06359a560b56f9e..40550f5a85d0b2d8935fa00a1b83d3b32e1411a3 100644 (file)
@@ -23,6 +23,7 @@ void do_syntactic_analysis() {
     fputws(L"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"fr_FR\" lang=\"fr_FR\">\n",
            target);
     c = fgetwc(source); // lecture du premier caractere
+    scanner();
     analyze_AXIOME();
     fputws(L"</html>\n", target);
 }
index 630985be4a8331b5f5147b21e084b03d10aab720..40d05232bb7004cc6e43f5624627440be7ebf6bd 100644 (file)
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <wchar.h>
+#include <stdarg.h>
 
 #include "print_helper.h"
 #include "global_vars.h"
@@ -61,3 +62,12 @@ void wprint_token(FILE* out_file) {
     }
     fflush(out_file);
 }
+
+void wprint_ctoken(FILE* out_file) {
+    if (tokenType == MOT || tokenType == MOTCLE) {
+        fwprintf(out_file, L"%20s: %ls\n", tokenTypestr[tokenType], tokenValue);
+    } else {
+        fwprintf(out_file, L"%20s\n", tokenTypestr[tokenType]);
+    }
+    fflush(out_file);
+}
index 080ea9ddec4ff018eb21770d0434d3700076a5e3..d5cc42a1b2a8ce4388b82698e4f150d01e8ac254 100644 (file)
@@ -12,5 +12,6 @@ void wpr_warning(const wchar_t *format, ...);
 void wpr_error(const wchar_t *format, ...);
 
 void wprint_token(FILE* out_file);
+void wprint_ctoken(FILE* out_file);
 
 #endif /* PRINT_HELPER_H_ */
index ddef90b12707dc5f09009e2d62f182a46899cd0c..65997ddfed47b40dad0ef4008599cbd8cb2a5828 100644 (file)
@@ -8,7 +8,7 @@
 #include "lexical_analyzer.h"
 #include "print_helper.h"
 
-#define PRINT_TOKEN 0
+#define PRINT_TOKEN 1
 
 /* Syntactic analyzer functions implementation */
 
@@ -19,16 +19,14 @@ static void analyze_TEXT() {
     fprintf(stdout, "entering %s\n", __func__);
     #endif
     if (tokenType == MOT) {
-        scanner();
+        #if PRINT_TOKEN
+        wprint_ctoken(stdout);
+        #endif
         if (target != NULL) {
-            fputws((const wchar_t*)token[tokenFound].value, target);
+            fputws((const wchar_t*)tokenValue, target);
             fputws(L" ", target);
         }
-        #if PRINT_TOKEN
-        wprint_token(stdout);
-        #endif
-        token[tokenFound].type = tokenTypestr[tokenType];
-        tokenFound++;
+        scanner();
         analyze_TEXT();
     } else if (tokenType != MOTCLE && tokenType != NPARA && tokenType != SECTION && \
                 tokenType != SSECTION && tokenType != FIN) {
@@ -46,39 +44,23 @@ static void analyze_P() {
     fprintf(stdout, "entering %s\n", __func__);
     #endif
     if (tokenType == NPARA) {
-        scanner();
         #if PRINT_TOKEN
-        wprint_token(stdout);
+        wprint_ctoken(stdout);
         #endif
+        scanner();
         if (target != NULL) {
             fputws(L"<p>\n", target);
-            fputws((const wchar_t*)token[tokenFound].value, target);
-            fputws(L" ", target);
         }
-        token[tokenFound].type = tokenTypestr[tokenType];
-        tokenFound++;
-        if (tokenType == MOT) {
-            scanner();
-            #if PRINT_TOKEN
-            wprint_token(stdout);
-            #endif
-            if (target != NULL) {
-                fputws((const wchar_t*)token[tokenFound].value, target);
-                fputws(L" ", target);
-            }
-            token[tokenFound].type = tokenTypestr[tokenType];
-            tokenFound++;
-            analyze_TEXT();
-            if (target != NULL) {
-                fputws(L"\n</p>\n", target);
-            }
-            analyze_P();
+        analyze_TEXT();
+        if (target != NULL) {
+            fputws(L"\n</p>\n", target);
+        }
+        analyze_P();
         } else if (tokenType != SECTION && tokenType != SSECTION && tokenType != FIN) {
             fprintf(stderr, "%s follows error on %s\n", __func__, tokenTypestr[tokenType]);
             fflush(stderr);
             exit(EXIT_FAILURE);
         }
-    }
     #if DEBUG
     fprintf(stdout, "leaving %s\n", __func__);
     #endif
@@ -89,31 +71,25 @@ static void analyze_HEAD() {
     fprintf(stdout, "entering %s\n", __func__);
     #endif
     if (tokenType == MOTCLE) {
-        scanner();
-        #if PRINT_TOKEN
-        wprint_token(stdout);
-        #endif /* PRINT_TOKEN */
-        token[tokenFound].type = tokenTypestr[tokenType];
-        tokenFound++;
         //FIXME: Check if the MOTCLE token value is set to >Titre
         if (target != NULL) {
             fputws(L"<title>\n", target);
-            fputws((const wchar_t*)token[tokenFound].value, target);
             fputws(L" ", target);
         }
+        scanner();
         analyze_TEXT();
         if (target != NULL) {
             fputws(L"\n</title>\n", target);
         }
         if (tokenType == MOTCLE) {
-            scanner();
             #if PRINT_TOKEN
-            wprint_token(stdout);
+            wprint_ctoken(stdout);
             #endif /* PRINT_TOKEN */
-            token[tokenFound].type = tokenTypestr[tokenType];
-            tokenFound++;
+            scanner();
             //The text contain the author
+            fputws(L"<meta name=\"author\" content=\"", target);
             analyze_TEXT();
+            fputws(L"\">", target);
         } else if (tokenType != NPARA && tokenType != SECTION && tokenType != FIN) {
             fprintf(stderr, "%s follows error on %s\n", __func__, tokenTypestr[tokenType]);
             fflush(stderr);
@@ -130,21 +106,21 @@ static void analyze_H1() {
     fprintf(stdout, "entering %s\n", __func__);
     #endif
     if (tokenType == SECTION) {
-        scanner();
         #if PRINT_TOKEN
-        wprint_token(stdout);
+        wprint_ctoken(stdout);
         #endif /* PRINT_TOKEN */
         if (target != NULL) {
             fputws(L"<h1>\n", target);
-            fputws((const wchar_t*)token[tokenFound].value, target);
-            fputws(L" ", target);
         }
-        token[tokenFound].type = tokenTypestr[tokenType];
-        tokenFound++;
+        scanner();
         analyze_TEXT();
         if (target != NULL) {
             fputws(L"\n</h1>\n", target);
         }
+    } else {
+        fprintf(stderr, "%s error\n", __func__);
+        fflush(stderr);
+        exit(EXIT_FAILURE);
     }
     #if DEBUG
     fprintf(stdout, "leaving %s\n", __func__);
@@ -156,17 +132,13 @@ static void analyze_H2() {
     fprintf(stdout, "entering %s\n", __func__);
     #endif
     if (tokenType == SSECTION) {
-        scanner();
         #if PRINT_TOKEN
-        wprint_token(stdout);
+        wprint_ctoken(stdout);
         #endif /* PRINT_TOKEN */
         if (target != NULL) {
             fputws(L"<h2>\n", target);
-            fputws((const wchar_t*)token[tokenFound].value, target);
-            fputws(L" ", target);
         }
-        token[tokenFound].type = tokenTypestr[tokenType];
-        tokenFound++;
+        scanner();
         analyze_TEXT();
         if (target != NULL) {
             fputws(L"\n</h2>\n", target);
@@ -181,7 +153,6 @@ static void analyze_S2() {
     #if DEBUG
     fprintf(stdout, "entering %s\n", __func__);
     #endif
-    //FIXME: This test is probably useless
     if (tokenType == SSECTION) {
         analyze_H2();
         analyze_P();
@@ -200,7 +171,6 @@ static void analyze_S1() {
     #if DEBUG
     fprintf(stdout, "entering %s\n", __func__);
     #endif
-    //FIXME: This test is probably useless
     if (tokenType == SECTION) {
         analyze_H1();
         analyze_P();
@@ -231,13 +201,10 @@ void analyze_AXIOME() {
     #if DEBUG
     fprintf(stdout, "entering %s\n", __func__);
     #endif
-    scanner();
     /* print the lexical analysis result */
     #if PRINT_TOKEN
-    wprint_token(stdout);
+    wprint_ctoken(stdout);
     #endif /* PRINT_TOKEN */
-    token[tokenFound].type = tokenTypestr[tokenType];
-    tokenFound++;
     if (target != NULL) {
         fputws(L"<head>\n", target);
     }