#include <stdbool.h>
#include <stdarg.h>
+#include <stdlib.h>
#include "global_vars.h"
#include "lexical_analyzer.h"
+#include "print_helper.h"
+
+#define PRINT_TOKEN 0
/* Syntactic analyzer functions implementation */
enum TokenType tokenType;
-static bool analyze_TEXT() {
- bool rtval = true;
+static void analyze_TEXT() {
+ #if DEBUG
+ fprintf(stdout, "entering %s\n", __func__);
+ #endif
if (tokenType == MOT) {
scanner();
- rtval = analyze_TEXT();
+ #if PRINT_TOKEN
+ wprint_token();
+ #endif
+ token[tokenFound].type = tokenTypestr[tokenType];
+ tokenFound++;
+ analyze_TEXT();
} else if (tokenType != MOTCLE && tokenType != NPARA && tokenType != SECTION && \
tokenType != SSECTION && tokenType != FIN) {
- rtval = false;
+ fprintf(stderr, "%s follows error on %s\n", __func__, tokenTypestr[tokenType]);
+ exit(EXIT_FAILURE);
}
- return rtval;
+ #if DEBUG
+ fprintf(stdout, "leaving %s\n", __func__);
+ #endif
}
-static bool analyze_P() {
- bool rtval = true;
+static void analyze_P() {
+ #if DEBUG
+ fprintf(stdout, "entering %s\n", __func__);
+ #endif
if (tokenType == NPARA) {
scanner();
+ #if PRINT_TOKEN
+ wprint_token();
+ #endif
+ token[tokenFound].type = tokenTypestr[tokenType];
+ tokenFound++;
if (tokenType == MOT) {
scanner();
- rtval = analyze_TEXT();
- rtval = analyze_P();
+ #if PRINT_TOKEN
+ wprint_token();
+ #endif
+ token[tokenFound].type = tokenTypestr[tokenType];
+ tokenFound++;
+ analyze_TEXT();
+ analyze_P();
+ } else if (tokenType != SECTION && tokenType != SSECTION && tokenType != FIN) {
+ fprintf(stderr, "%s follows error on %s\n", __func__, tokenTypestr[tokenType]);
+ exit(EXIT_FAILURE);
}
} else if (tokenType != SECTION && tokenType != SSECTION && tokenType != FIN) {
- rtval = false;
+ fprintf(stderr, "%s follows error on %s\n", __func__, tokenTypestr[tokenType]);
+ exit(EXIT_FAILURE);
}
- return rtval;
+ #if DEBUG
+ fprintf(stdout, "leaving %s\n", __func__);
+ #endif
}
-static bool analyze_HEAD() {
- bool rtval = true;
+static void analyze_HEAD() {
+ #if DEBUG
+ fprintf(stdout, "entering %s\n", __func__);
+ #endif
if (tokenType == MOTCLE) {
scanner();
- rtval = analyze_TEXT();
+ #if PRINT_TOKEN
+ wprint_token();
+ #endif
+ token[tokenFound].type = tokenTypestr[tokenType];
+ tokenFound++;
+ analyze_TEXT();
if (tokenType == MOTCLE) {
scanner();
- rtval = analyze_TEXT();
- } else {
- rtval = false;
+ #if PRINT_TOKEN
+ wprint_token();
+ #endif /* PRINT_TOKEN */
+ token[tokenFound].type = tokenTypestr[tokenType];
+ tokenFound++;
+ analyze_TEXT();
+ } else if (tokenType != NPARA && tokenType != SECTION && tokenType != FIN) {
+ fprintf(stderr, "%s follows error on %s\n", __func__, tokenTypestr[tokenType]);
+ exit(EXIT_FAILURE);
}
- } else {
- rtval = false;
+ } else if (tokenType != NPARA && tokenType != SECTION && tokenType != FIN) {
+ fprintf(stderr, "%s follows error on %s\n", __func__, tokenTypestr[tokenType]);
+ exit(EXIT_FAILURE);
}
- return rtval;
+ #if DEBUG
+ fprintf(stdout, "leaving %s\n", __func__);
+ #endif
}
-static bool analyze_H1() {
- bool rtval = true;
+static void analyze_H1() {
+ #if DEBUG
+ fprintf(stdout, "entering %s\n", __func__);
+ #endif
if (tokenType == SECTION) {
scanner();
- rtval = analyze_TEXT();
- } else {
- rtval = false;
+ #if PRINT_TOKEN
+ wprint_token();
+ #endif /* PRINT_TOKEN */
+ token[tokenFound].type = tokenTypestr[tokenType];
+ tokenFound++;
+ analyze_TEXT();
}
- return rtval;
+ #if DEBUG
+ fprintf(stdout, "leaving %s\n", __func__);
+ #endif
}
-static bool analyze_H2() {
- bool rtval = true;
+static void analyze_H2() {
+ #if DEBUG
+ fprintf(stdout, "entering %s\n", __func__);
+ #endif
if (tokenType == SSECTION) {
scanner();
- rtval = analyze_TEXT();
- } else {
- rtval = false;
+ #if PRINT_TOKEN
+ wprint_token();
+ #endif /* PRINT_TOKEN */
+ token[tokenFound].type = tokenTypestr[tokenType];
+ tokenFound++;
+ analyze_TEXT();
}
- return rtval;
+ #if DEBUG
+ fprintf(stdout, "leaving %s\n", __func__);
+ #endif
}
-static bool analyze_S2() {
- bool rtval = true;
- if (analyze_H2()) {
- rtval = analyze_P();
- rtval = analyze_S2();
+static void analyze_S2() {
+ #if DEBUG
+ fprintf(stdout, "entering %s\n", __func__);
+ #endif
+ if (tokenType == SSECTION) {
+ analyze_H2();
+ analyze_P();
+ analyze_S2();
} else if (tokenType != SECTION && tokenType != FIN) {
- rtval = false;
- } else {
- rtval = false;
+ fprintf(stderr, "%s follows error on %s\n", __func__, tokenTypestr[tokenType]);
+ exit(EXIT_FAILURE);
}
- return rtval;
+ #if DEBUG
+ fprintf(stdout, "leaving %s\n", __func__);
+ #endif
}
-static bool analyze_S1() {
- bool rtval = true;
- if (analyze_H1()) {
- rtval = analyze_P();
- rtval = analyze_S2();
- rtval = analyze_S1();
+static void analyze_S1() {
+ #if DEBUG
+ fprintf(stdout, "entering %s\n", __func__);
+ #endif
+ if (tokenType == SECTION) {
+ analyze_H1();
+ analyze_P();
+ analyze_S2();
+ analyze_S1();
} else if (tokenType != FIN) {
- rtval = false;
- } else {
- rtval = false;
+ fprintf(stderr, "%s follows error on %s\n", __func__, tokenTypestr[tokenType]);
+ exit(EXIT_FAILURE);
}
- return rtval;
+ #if DEBUG
+ fprintf(stdout, "leaving %s\n", __func__);
+ #endif
}
-static bool analyze_BODY() {
- bool rtval = true;
- rtval = analyze_P();
- rtval = analyze_S1();
- return rtval;
+static void analyze_BODY() {
+ #if DEBUG
+ fprintf(stdout, "entering %s\n", __func__);
+ #endif
+ analyze_P();
+ analyze_S1();
+ #if DEBUG
+ fprintf(stdout, "leaving %s\n", __func__);
+ #endif
}
-bool analyze_AXIOME() {
- bool rtval = true;
+void analyze_AXIOME() {
+ #if DEBUG
+ fprintf(stdout, "entering %s\n", __func__);
+ #endif
scanner();
- rtval = analyze_HEAD();
- rtval = analyze_BODY();
+ /* print the lexical analysis result */
+ #if PRINT_TOKEN
+ wprint_token();
+ #endif /* PRINT_TOKEN */
+ token[tokenFound].type = tokenTypestr[tokenType];
+ tokenFound++;
+ analyze_HEAD();
+ analyze_BODY();
if (tokenType != FIN) {
- rtval = false;
+ fprintf(stderr, "%s follows error on %s\n", __func__, tokenTypestr[tokenType]);
+ exit(EXIT_FAILURE);
}
- return rtval;
+ fprintf(stdout, "successful syntactic analysis\n");
+ #if DEBUG
+ fprintf(stdout, "leaving %s\n", __func__);
+ #endif
}