1 /* -*- c -*- = mode for emacs editor
3 TREELANG lexical analysis
5 ---------------------------------------------------------------------
7 Copyright (C) 1986, 87, 89, 92-96, 1997, 1999, 2000, 2001, 2002, 2003, 2004
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
37 #include "coretypes.h"
48 extern int option_lexer_trace;
51 void update_yylval (int a);
53 static int next_tree_charno = 1;
54 static int lineno = 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);}}
63 #ifndef USE_MAPPED_LOCATION
64 #define LINEMAP_POSITION_FOR_COLUMN(INPUT, LINETABLE, COL)
77 /* ??? Should really allocate only what we need. */
78 yylval = my_malloc (sizeof (struct prod_token_parm_item));
79 LINEMAP_POSITION_FOR_COLUMN (input_location, &line_table,
81 ((struct prod_token_parm_item *)yylval)->tp.tok.location = input_location;
82 ((struct prod_token_parm_item *)yylval)->tp.tok.charno = next_tree_charno;
86 update_lineno_charno ();
87 NOT_RETURN (WHITESPACE);
92 update_lineno_charno ();
97 update_lineno_charno ();
98 SAVE_RETURN (LEFT_BRACE);
102 update_lineno_charno ();
103 SAVE_RETURN (RIGHT_BRACE);
107 update_lineno_charno ();
108 SAVE_RETURN (LEFT_PARENTHESIS);
112 update_lineno_charno ();
113 SAVE_RETURN (RIGHT_PARENTHESIS);
117 update_lineno_charno ();
122 update_lineno_charno ();
123 SAVE_RETURN (SEMICOLON);
127 update_lineno_charno ();
128 SAVE_RETURN (tl_PLUS);
132 update_lineno_charno ();
133 SAVE_RETURN (tl_MINUS);
137 update_lineno_charno ();
138 SAVE_RETURN (ASSIGN);
142 update_lineno_charno ();
143 SAVE_RETURN (EQUALS);
147 update_lineno_charno ();
148 SAVE_RETURN (INTEGER);
151 "external_reference" {
152 update_lineno_charno ();
153 SAVE_RETURN (EXTERNAL_REFERENCE);
156 "external_definition" {
157 update_lineno_charno ();
158 SAVE_RETURN (EXTERNAL_DEFINITION);
162 update_lineno_charno ();
163 SAVE_RETURN (STATIC);
167 update_lineno_charno ();
168 SAVE_RETURN (AUTOMATIC);
172 update_lineno_charno ();
177 update_lineno_charno ();
182 update_lineno_charno ();
187 update_lineno_charno ();
188 SAVE_RETURN (UNSIGNED);
192 update_lineno_charno ();
193 SAVE_RETURN (tl_RETURN);
197 update_lineno_charno ();
202 update_lineno_charno ();
206 [A-Za-z_]+[A-Za-z_0-9]* {
207 update_lineno_charno ();
208 update_yylval (NAME);
209 if (option_lexer_trace)
211 fprintf (stderr, "\nlexer returning");
212 dump_lex_value (NAME);
218 update_lineno_charno ();
219 error ("%HUnrecognized character %qc.",
220 &((struct prod_token_parm_item *)yylval)->tp.tok.location,
227 Update line number (1-) and character number (1-). Call this
228 before processing the token. */
231 update_lineno_charno (void)
233 /* Update the values we send to caller in case we sometimes don't
234 tell them about all the 'tokens' eg comments etc. */
236 LINEMAP_POSITION_FOR_COLUMN (input_location, &line_table,
238 ((struct prod_token_parm_item *)yylval)->tp.tok.location = input_location;
239 ((struct prod_token_parm_item *)yylval)->tp.tok.charno = next_tree_charno;
241 for ( yyl = 0; yyl < yyleng; ++yyl )
243 if ( yytext[yyl] == '\n' )
245 #ifdef USE_MAPPED_LOCATION
246 source_location s = linemap_line_start (&line_table, ++lineno,
250 input_line = ++lineno;
252 next_tree_charno = 1;
259 /* Fill in the fields of yylval - the value of the token. The token
262 update_yylval (int a)
264 struct prod_token_parm_item * tok;
267 tok->category = token_category;
269 tok->tp.tok.length = yyleng;
270 /* Have to copy yytext as it is just a ptr into the buffer at the
272 tok->tp.tok.chars = (unsigned char*) get_string (yytext, yyleng);
275 /* Trace the value LEXRET and the position and token details being
276 returned by the lexical analyser. */
279 dump_lex_value (int lexret)
283 fprintf (stderr, " %d l:%d c:%d ln:%d text=", lexret,
284 LOCATION_LINE (((struct prod_token_parm_item *)
285 yylval)->tp.tok.location),
286 ((struct prod_token_parm_item *) yylval)->tp.tok.charno,
287 ((struct prod_token_parm_item *) yylval)->tp.tok.length);
289 for (ix = 0; ix < yyleng; ix++)
291 fprintf (stderr, "%c", yytext[ix]);
293 fprintf (stderr, " in hex:");
294 for (ix = 0; ix < yyleng; ix++)
296 fprintf (stderr, " %2.2x", yytext[ix]);
298 fprintf (stderr, "\n");