Initial revision of "T7", the compiler from hell
[T7] / plain.c
1 /*
2  * A naive recursive-descent expression parser
3  *
4  * Copyright (C) 2018 Nicolas Mauger
5  * This file is subject to the terms and conditions of the
6  * CeCILL free software license agreement. See the file
7  * LICENSE in the main directory of T7 for more details.
8  */
9
10 #include <stdio.h>
11
12 #include "lex.h"
13 #include "plain.h"
14
15 void statements()
16 {
17     /*
18      * statments -> expression SEMI
19      *           |  expression SEMI statements
20      */
21
22     expression();
23
24     if (match (SEMI)) advance();
25     else
26     {
27         fprintf(stderr, "%d: Inserting missing semicolon\n", yylineno);
28     }
29
30     if (!match(EOI)) statements();
31 }
32
33 void expression()
34 {
35     /* expression -> term expression */
36
37     term();
38     expr_prime();
39 }
40
41
42 void expr_prime()
43 {
44     /* expression -> PLUS term expression
45      *            |  epsilon
46      */
47
48     if (match(PLUS))
49     {
50         advance();
51         term();
52         expr_prime();
53     }
54 }
55
56 void term()
57 {
58     /* term -> factor term */
59
60     factor();
61     term_prime();
62 }
63
64 void term_prime()
65 {
66     /* term -> TIMES factor term
67      *      |  epsilon
68      */
69
70     if (match(TIMES))
71     {
72         advance();
73         factor();
74         term_prime();
75     }
76 }
77
78 void factor()
79 {
80     /* factor -> NUM_OR_ID
81      *        |  LP expression RP
82      */
83
84     if (match(NUM_OR_ID)) advance();
85     else if (match(LP))
86     {
87         advance();
88         expression();
89
90         if (match(RP)) advance();
91         else
92         {
93             fprintf(stderr, "%d: Mismatched parenthesis\n", yylineno);
94         }
95
96     }
97     else
98     {
99         fprintf(stderr, "%d: Number or identifier expected\n", yylineno);
100     }
101
102 }
103