Major code revamping:
[TP_AL_C.git] / lexer / syntactic_analyzer.c
diff --git a/lexer/syntactic_analyzer.c b/lexer/syntactic_analyzer.c
new file mode 100644 (file)
index 0000000..e23c130
--- /dev/null
@@ -0,0 +1,122 @@
+/* Syntactic analyzer */
+
+#include <stdbool.h>
+#include <stdarg.h>
+
+#include "global_vars.h"
+#include "lexical_analyzer.h"
+
+/* Syntactic analyzer functions implementation */
+
+enum TokenType tokenType;
+
+static bool analyze_TEXT() {
+    bool rtval = true;
+    if (tokenType == MOT) {
+        scanner();
+        rtval = analyze_TEXT();
+    } else if (tokenType != MOTCLE && tokenType != NPARA && tokenType != SECTION && \
+                tokenType != SSECTION && tokenType != FIN) {
+        rtval = false;
+    }
+    return rtval;
+}
+
+static bool analyze_P() {
+    bool rtval = true;
+    if (tokenType == NPARA) {
+        scanner();
+        if (tokenType == MOT) {
+            scanner();
+            rtval = analyze_TEXT();
+            rtval = analyze_P();
+        }
+    } else if (tokenType != SECTION && tokenType != SSECTION && tokenType != FIN) {
+        rtval = false;
+    }
+    return rtval;
+}
+
+static bool analyze_HEAD() {
+    bool rtval = true;
+    if (tokenType == MOTCLE) {
+        scanner();
+        rtval = analyze_TEXT();
+        if (tokenType == MOTCLE) {
+            scanner();
+            rtval = analyze_TEXT();
+        } else {
+            rtval = false;
+        }
+    } else {
+        rtval = false;
+    }
+    return rtval;
+}
+
+static bool analyze_H1() {
+    bool rtval = true;
+    if (tokenType == SECTION) {
+        scanner();
+        rtval = analyze_TEXT();
+    } else {
+        rtval = false;
+    }
+    return rtval;
+}
+
+static bool analyze_H2() {
+    bool rtval = true;
+    if (tokenType == SSECTION) {
+        scanner();
+        rtval = analyze_TEXT();
+    } else {
+        rtval = false;
+    }
+    return rtval;
+}
+
+static bool analyze_S2() {
+    bool rtval = true;
+    if (analyze_H2()) {
+        rtval = analyze_P();
+        rtval = analyze_S2();
+    } else if (tokenType != SECTION && tokenType != FIN) {
+        rtval = false;
+    } else {
+        rtval = false;
+    }
+    return rtval;
+}
+
+static bool analyze_S1() {
+    bool rtval = true;
+    if (analyze_H1()) {
+        rtval = analyze_P();
+        rtval = analyze_S2();
+        rtval = analyze_S1();
+    } else if (tokenType != FIN) {
+        rtval = false;
+    } else {
+        rtval = false;
+    }
+    return rtval;
+}
+
+static bool analyze_BODY() {
+    bool rtval = true;
+    rtval = analyze_P();
+    rtval = analyze_S1();
+    return rtval;
+}
+
+bool analyze_AXIOME() {
+    bool rtval = true;
+    scanner();
+    rtval = analyze_HEAD();
+    rtval = analyze_BODY();
+    if (tokenType != FIN) {
+        rtval = false;
+    }
+    return rtval;
+}