e23c130d5bb24c22fa93c966fd9c736c8c4c35db
[TP_AL_C.git] / lexer / syntactic_analyzer.c
1 /* Syntactic analyzer */
2
3 #include <stdbool.h>
4 #include <stdarg.h>
5
6 #include "global_vars.h"
7 #include "lexical_analyzer.h"
8
9 /* Syntactic analyzer functions implementation */
10
11 enum TokenType tokenType;
12
13 static bool analyze_TEXT() {
14 bool rtval = true;
15 if (tokenType == MOT) {
16 scanner();
17 rtval = analyze_TEXT();
18 } else if (tokenType != MOTCLE && tokenType != NPARA && tokenType != SECTION && \
19 tokenType != SSECTION && tokenType != FIN) {
20 rtval = false;
21 }
22 return rtval;
23 }
24
25 static bool analyze_P() {
26 bool rtval = true;
27 if (tokenType == NPARA) {
28 scanner();
29 if (tokenType == MOT) {
30 scanner();
31 rtval = analyze_TEXT();
32 rtval = analyze_P();
33 }
34 } else if (tokenType != SECTION && tokenType != SSECTION && tokenType != FIN) {
35 rtval = false;
36 }
37 return rtval;
38 }
39
40 static bool analyze_HEAD() {
41 bool rtval = true;
42 if (tokenType == MOTCLE) {
43 scanner();
44 rtval = analyze_TEXT();
45 if (tokenType == MOTCLE) {
46 scanner();
47 rtval = analyze_TEXT();
48 } else {
49 rtval = false;
50 }
51 } else {
52 rtval = false;
53 }
54 return rtval;
55 }
56
57 static bool analyze_H1() {
58 bool rtval = true;
59 if (tokenType == SECTION) {
60 scanner();
61 rtval = analyze_TEXT();
62 } else {
63 rtval = false;
64 }
65 return rtval;
66 }
67
68 static bool analyze_H2() {
69 bool rtval = true;
70 if (tokenType == SSECTION) {
71 scanner();
72 rtval = analyze_TEXT();
73 } else {
74 rtval = false;
75 }
76 return rtval;
77 }
78
79 static bool analyze_S2() {
80 bool rtval = true;
81 if (analyze_H2()) {
82 rtval = analyze_P();
83 rtval = analyze_S2();
84 } else if (tokenType != SECTION && tokenType != FIN) {
85 rtval = false;
86 } else {
87 rtval = false;
88 }
89 return rtval;
90 }
91
92 static bool analyze_S1() {
93 bool rtval = true;
94 if (analyze_H1()) {
95 rtval = analyze_P();
96 rtval = analyze_S2();
97 rtval = analyze_S1();
98 } else if (tokenType != FIN) {
99 rtval = false;
100 } else {
101 rtval = false;
102 }
103 return rtval;
104 }
105
106 static bool analyze_BODY() {
107 bool rtval = true;
108 rtval = analyze_P();
109 rtval = analyze_S1();
110 return rtval;
111 }
112
113 bool analyze_AXIOME() {
114 bool rtval = true;
115 scanner();
116 rtval = analyze_HEAD();
117 rtval = analyze_BODY();
118 if (tokenType != FIN) {
119 rtval = false;
120 }
121 return rtval;
122 }