1 /* -*- c -*- = mode for emacs editor
3 TREELANG lexical analysis
5 ---------------------------------------------------------------------
7 Copyright (C) 1986, 87, 89, 92-96, 1997, 1999, 2000, 2001, 2002
8 Free Software Foundation, Inc.
10 This program is free software; you can redistribute it and/or modify it
11 under the terms of the GNU General Public License as published by the
12 Free Software Foundation; either version 2, or (at your option) any
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA.
25 In other words, you are welcome to use, share and improve this program.
26 You are forbidden to forbid anyone else to use, share and improve
27 what you give them. Help stamp out software-hoarding!
29 ---------------------------------------------------------------------
31 Written by Tim Josling 1999-2001, based in part on other parts of
39 #include "coretypes.h"
41 #include "diagnostic.h"
48 extern int option_lexer_trace;
51 void update_yylval (int a);
53 static int next_tree_lineno=1;
54 static int next_tree_charno=1;
56 static void update_lineno_charno (void);
57 static void dump_lex_value (int lexret);
59 #define SAVE_RETURN(a) {update_yylval (a); if (option_lexer_trace)\
60 {fprintf (stderr, "\nlexer returning"); dump_lex_value (a);} return a;}
61 #define NOT_RETURN(a) {update_yylval (a); if (option_lexer_trace)\
62 {fprintf (stderr, "\nlexer swallowing"); dump_lex_value (a);}}
75 /* Should really allocate only what we need. lll;. */
76 yylval = my_malloc (sizeof (struct prod_token_parm_item));
77 ((struct prod_token_parm_item *)yylval)->tp.tok.lineno = next_tree_lineno;
78 ((struct prod_token_parm_item *)yylval)->tp.tok.charno = next_tree_charno;
82 update_lineno_charno ();
83 NOT_RETURN (WHITESPACE);
88 update_lineno_charno ();
93 update_lineno_charno ();
94 SAVE_RETURN (LEFT_BRACE);
98 update_lineno_charno ();
99 SAVE_RETURN (RIGHT_BRACE);
103 update_lineno_charno ();
104 SAVE_RETURN (LEFT_PARENTHESIS);
108 update_lineno_charno ();
109 SAVE_RETURN (RIGHT_PARENTHESIS);
113 update_lineno_charno ();
118 update_lineno_charno ();
119 SAVE_RETURN (SEMICOLON);
123 update_lineno_charno ();
128 update_lineno_charno ();
133 update_lineno_charno ();
134 SAVE_RETURN (ASSIGN);
138 update_lineno_charno ();
139 SAVE_RETURN (EQUALS);
143 update_lineno_charno ();
144 SAVE_RETURN (INTEGER);
147 "external_reference" {
148 update_lineno_charno ();
149 SAVE_RETURN (EXTERNAL_REFERENCE);
152 "external_definition" {
153 update_lineno_charno ();
154 SAVE_RETURN (EXTERNAL_DEFINITION);
158 update_lineno_charno ();
159 SAVE_RETURN (STATIC);
163 update_lineno_charno ();
164 SAVE_RETURN (AUTOMATIC);
168 update_lineno_charno ();
173 update_lineno_charno ();
178 update_lineno_charno ();
183 update_lineno_charno ();
184 SAVE_RETURN (UNSIGNED);
188 update_lineno_charno ();
189 SAVE_RETURN (RETURN);
193 update_lineno_charno ();
198 update_lineno_charno ();
202 [A-Za-z_]+[A-Za-z_0-9]* {
203 update_lineno_charno ();
204 update_yylval (NAME);
205 if (option_lexer_trace)
207 fprintf (stderr, "\nlexer returning");
208 dump_lex_value (NAME);
214 update_lineno_charno ();
215 fprintf (stderr, "%s:%i:%i: Unrecognized character %c\n", in_fname,
216 ((struct prod_token_parm_item *)yylval)->tp.tok.lineno,
217 ((struct prod_token_parm_item *)yylval)->tp.tok.charno, yytext[0]);
224 Update line number (1-) and character number (1-). Call this
225 before processing the token. */
228 update_lineno_charno (void)
230 /* Update the values we send to caller in case we sometimes don't
231 tell them about all the 'tokens' eg comments etc. */
233 ((struct prod_token_parm_item *)yylval)->tp.tok.lineno = next_tree_lineno;
234 ((struct prod_token_parm_item *)yylval)->tp.tok.charno = next_tree_charno;
235 for ( yyl = 0; yyl < yyleng; ++yyl )
237 if ( yytext[yyl] == '\n' )
240 next_tree_charno = 1;
247 /* Fill in the fields of yylval - the value of the token. The token
250 update_yylval (int a)
252 struct prod_token_parm_item * tok;
255 tok->category = token_category;
257 tok->tp.tok.length = yyleng;
258 /* Have to copy yytext as it is just a ptr into the buffer at the
260 tok->tp.tok.chars = my_malloc (yyleng + 1);
261 memcpy (tok->tp.tok.chars, yytext, yyleng);
264 /* Trace the value LEXRET and the position and token details being
265 returned by the lexical analyser. */
268 dump_lex_value (int lexret)
271 fprintf (stderr, " %d l:%d c:%d ln:%d text=", lexret,
272 ((struct prod_token_parm_item *) yylval)->tp.tok.lineno,
273 ((struct prod_token_parm_item *) yylval)->tp.tok.charno,
274 ((struct prod_token_parm_item *) yylval)->tp.tok.length);
275 for (ix = 0; ix < yyleng; ix++)
277 fprintf (stderr, "%c", yytext[ix]);
279 fprintf (stderr, " in hex:");
280 for (ix = 0; ix < yyleng; ix++)
282 fprintf (stderr, " %2.2x", yytext[ix]);
284 fprintf (stderr, "\n");