git.maugern.fr Git - T7/blob - lex.c
First improvements
[T7] / lex.c
1 /*
2  * A simple lexical analyzer
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 #include <ctype.h>
12
13 #include "lex.h"
14
15 char *yytext   = ""; /* Lexeme (not '\0' terminated */
16 int   yyleng   =  0; /* Lexeme length */
17 int   yylineno =  0; /* Input line number */
18
19 int lex()
20 {
21     static char input_buffer[128];
22     char *current;
23
24     current = yytext + yyleng;
25
26     while (1)
27     {
28         while ( !*current)
29         {
30             /* Get new lines, skipping any leading white space on the line, until a nonblank line is found. */
31
32             current = input_buffer;
33             if (!fgets(input_buffer, sizeof(input_buffer), stdin))
34             {
35                 current = '\0';
36                 return EOI;
37             }
38
39             ++yylineno;
40
41             while (isspace(*current)) ++current;
42         }
43
44         for (; *current ; ++current)
45         {
46             /* Get the next token */
47             yytext = current;
48             yyleng = 1;
49
50             switch (*current)
51             {
52             case EOF:
53                 return EOI ;
54             case ';':
55                 return SEMI;
56             case '+':
57                 return PLUS;
58             case '*':
59                 return TIMES;
60             case '(':
61                 return LP;
62             case ')':
63                 return RP;
64
65             case '\n':
66             case '\t':
67             case '\r':
68             case  ' ':
69                 break;
70
71             default:
72                 if (!isalnum(*current))
73                 {
74                     fprintf(stderr, "Ignore illegal input <%c>\n", *current);
75                 }
76                 else
77                 {
78                     while (isalnum(*current)) ++current;
79
80                     yyleng = current - yytext;
81                     return NUM_OR_ID;
82                 }
83
84                 break;
85             }
86         }
87     }
88 }
89
90 static int Lookahead = -1; /* Lookahead token */
91
92 int match (int token )
93 {
94     /* Return true if "token" matches the current lookahead symbol. */
95
96     if (Lookahead == -1) Lookahead = lex();
97
98     return token == Lookahead;
99
100 }
101
102 void advance()
103 {
104     /* Advance the lookahead to the next input symbol. */
105
106     Lookahead = lex();
107 }