Syntactic analyser implementation with HTML conversion code
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Mon, 20 Nov 2017 11:23:28 +0000 (12:23 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Mon, 20 Nov 2017 11:23:28 +0000 (12:23 +0100)
from MD syntax.

Yes, there's an off-by-one in the syntactic analyser but for now,
it is working ...

Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
lexer/main.c
lexer/print_helper.c
lexer/print_helper.h
lexer/syntactic_analyzer.c
lexer/test.txt

index c67370df93b76d9f8c905f569322c4c60691a9e0..f8622174c4b2c8cb52f5a84f4ce0aff74a87a6dc 100644 (file)
@@ -13,15 +13,18 @@ void do_lexical_analysis() {
     c = fgetwc(source); // lecture du premier caractere
     do {
         scanner();
-        wprint_token();
+        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"<!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
     analyze_AXIOME();
+    fputws(L"</html>\n", target);
 }
 
 void print_usage(const char* name) {
@@ -32,6 +35,7 @@ void print_usage(const char* name) {
                    " -i, --input<filename>: use <filename> as input file instead of standard input\n"
                    " -o, --output<filename>: use <filename> as output file instead of standard output\n",
             name);
+    fflush(stdout);
 }
 
 int main(int argc, char **argv) {
index 9f97a8fffe6f6acecd827d9382b5e8313ede6404..f7ab04ffb9887b2e2fbdf5d96ea06b6016ca509c 100644 (file)
@@ -53,11 +53,19 @@ void wpr_error(const wchar_t *format, ...) {
     fflush(stderr);
 }
 
-void wprint_token() {
+void wprint_token_stdout() {
+    if (tokenType == MOT || tokenType == MOTCLE) {
+        fwprintf(stdout, L"%20s: %ls\n", tokenTypestr[tokenType], token[tokenFound].value);
+    } else {
+        fwprintf(stdout, L"%20s\n", tokenTypestr[tokenType]);
+    }
+    fflush(stdout);
+}
+
+void wprint_token_target() {
     if (tokenType == MOT || tokenType == MOTCLE) {
         fwprintf(target, L"%20s: %ls\n", tokenTypestr[tokenType], token[tokenFound].value);
     } else {
         fwprintf(target, L"%20s\n", tokenTypestr[tokenType]);
     }
-    fflush(target);
 }
index 5daaa35fc1e0b5222fea0f948cfee92623127834..396afd448be74a6fe7a3886dbf8f3ed2929a3aff 100644 (file)
@@ -9,6 +9,7 @@ void pr_debug(const char *format, ...);
 void wpr_warning(const wchar_t *format, ...);
 void wpr_error(const wchar_t *format, ...);
 
-void wprint_token();
+void wprint_token_stdout();
+void wprint_token_target();
 
 #endif /* PRINT_HELPER_H_ */
index 8d2d2e93837565b1fe4f60085ee01623c377180f..29524f01f7b39d82d2328f3c773be5565941d30e 100644 (file)
@@ -20,8 +20,12 @@ static void analyze_TEXT() {
     #endif
     if (tokenType == MOT) {
         scanner();
+        if (target != NULL) {
+            fputws((const wchar_t*)token[tokenFound].value, target);
+            fputws(L" ", target);
+        }
         #if PRINT_TOKEN
-        wprint_token();
+        wprint_token_stdout();
         #endif
         token[tokenFound].type = tokenTypestr[tokenType];
         tokenFound++;
@@ -44,28 +48,36 @@ static void analyze_P() {
     if (tokenType == NPARA) {
         scanner();
         #if PRINT_TOKEN
-        wprint_token();
+        wprint_token_stdout();
         #endif
+        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();
+            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();
         } else if (tokenType != SECTION && tokenType != SSECTION && tokenType != FIN) {
             fprintf(stderr, "%s follows error on %s\n", __func__, tokenTypestr[tokenType]);
             fflush(stderr);
             exit(EXIT_FAILURE);
         }
-    } 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__);
@@ -79,28 +91,34 @@ static void analyze_HEAD() {
     if (tokenType == MOTCLE) {
         scanner();
         #if PRINT_TOKEN
-        wprint_token();
-        #endif
+        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);
+        }
         analyze_TEXT();
+        if (target != NULL) {
+            fputws(L"\n</title>\n", target);
+        }
         if (tokenType == MOTCLE) {
             scanner();
             #if PRINT_TOKEN
-            wprint_token();
+            wprint_token_stdout();
             #endif /* PRINT_TOKEN */
             token[tokenFound].type = tokenTypestr[tokenType];
             tokenFound++;
+            //The text contain the author
             analyze_TEXT();
         } else if (tokenType != NPARA && tokenType != SECTION && tokenType != FIN) {
             fprintf(stderr, "%s follows error on %s\n", __func__, tokenTypestr[tokenType]);
             fflush(stderr);
             exit(EXIT_FAILURE);
         }
-    } else if (tokenType != NPARA && tokenType != SECTION && 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__);
@@ -114,11 +132,19 @@ static void analyze_H1() {
     if (tokenType == SECTION) {
         scanner();
         #if PRINT_TOKEN
-        wprint_token();
+        wprint_token_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++;
         analyze_TEXT();
+        if (target != NULL) {
+            fputws(L"\n</h1>\n", target);
+        }
     }
     #if DEBUG
     fprintf(stdout, "leaving %s\n", __func__);
@@ -132,11 +158,19 @@ static void analyze_H2() {
     if (tokenType == SSECTION) {
         scanner();
         #if PRINT_TOKEN
-        wprint_token();
+        wprint_token_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++;
         analyze_TEXT();
+        if (target != NULL) {
+            fputws(L"\n</h2>\n", target);
+        }
     }
     #if DEBUG
     fprintf(stdout, "leaving %s\n", __func__);
@@ -147,6 +181,7 @@ 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();
@@ -165,6 +200,7 @@ 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();
@@ -198,12 +234,24 @@ void analyze_AXIOME() {
     scanner();
     /* print the lexical analysis result */
     #if PRINT_TOKEN
-    wprint_token();
+    wprint_token_stdout();
     #endif /* PRINT_TOKEN */
     token[tokenFound].type = tokenTypestr[tokenType];
     tokenFound++;
+    if (target != NULL) {
+        fputws(L"<head>\n", target);
+    }
     analyze_HEAD();
+    if (target != NULL) {
+        fputws(L"\n</head>\n", target);
+    }
+    if (target != NULL) {
+        fputws(L"<body>\n", target);
+    }
     analyze_BODY();
+    if (target != NULL) {
+        fputws(L"\n<body>\n", target);
+    }
     if (tokenType != FIN) {
         fprintf(stderr, "%s follows error on %s\n", __func__, tokenTypestr[tokenType]);
         fflush(stderr);
index f07f97970d8f42e1659acd05816c405328b397fe..895b968abc6426f832c04d1a718edb2c9f3a559e 100644 (file)
@@ -20,7 +20,7 @@ Ici vous pouvez ecrire vos paragraphes de section.
 Au besoin vous pouvez definir des sous sections, en les introduisant par
 deux symboles plus suivi du titre de sous section, comme ci-dessous.
 
-== Ma premiere sous Section
+== Ma premiere sous section
 
 Ici vous pouvez ecrire vos paragraphes de section toujours separes par une
 ou plusieurs lignes blanches.