1/* lex.h -- Public #include File (module.h template V1.0)
2   Copyright (C) 1995 Free Software Foundation, Inc.
3   Contributed by James Craig Burley.
4
5This file is part of GNU Fortran.
6
7GNU Fortran is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU Fortran is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU Fortran; see the file COPYING.  If not, write to
19the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA.
21
22   Owning Modules:
23      lex.c
24
25   Modifications:
26      22-Aug-89	 JCB  1.1
27	 Change for new ffewhere interface.
28*/
29
30/* Allow multiple inclusion to work. */
31
32#ifndef _H_f_lex
33#define _H_f_lex
34
35/* Simple definitions and enumerations. */
36
37typedef enum
38  {
39    FFELEX_typeNONE,
40    FFELEX_typeCOMMENT,
41    FFELEX_typeEOS,
42    FFELEX_typeEOF,
43    FFELEX_typeERROR,
44    FFELEX_typeRAW,
45    FFELEX_typeQUOTE,
46    FFELEX_typeDOLLAR,
47    FFELEX_typeHASH,
48    FFELEX_typePERCENT,
49    FFELEX_typeAMPERSAND,
50    FFELEX_typeAPOSTROPHE,
51    FFELEX_typeOPEN_PAREN,
52    FFELEX_typeCLOSE_PAREN,
53    FFELEX_typeASTERISK,
54    FFELEX_typePLUS,
55    FFELEX_typeMINUS,
56    FFELEX_typePERIOD,
57    FFELEX_typeSLASH,
58    FFELEX_typeNUMBER,		/* Grep: [0-9][0-9]*. */
59    FFELEX_typeOPEN_ANGLE,
60    FFELEX_typeEQUALS,
61    FFELEX_typeCLOSE_ANGLE,
62    FFELEX_typeNAME,		/* Grep: [A-Za-z][A-Za-z0-9_]*. */
63    FFELEX_typeCOMMA,
64    FFELEX_typePOWER,		/* "**". */
65    FFELEX_typeCONCAT,		/* "//". */
66    FFELEX_typeDEBUG,
67    FFELEX_typeNAMES,		/* Same as FFELEX_typeNAME in initial
68				   context. */
69    FFELEX_typeHOLLERITH,	/* <text> part of <nn>H<text>. */
70    FFELEX_typeCHARACTER,	/* <text> part of '<text>' or "<text>". */
71    FFELEX_typeCOLON,
72    FFELEX_typeSEMICOLON,
73    FFELEX_typeUNDERSCORE,
74    FFELEX_typeQUESTION,
75    FFELEX_typeOPEN_ARRAY,	/* "(/". */
76    FFELEX_typeCLOSE_ARRAY,	/* "/)". */
77    FFELEX_typeCOLONCOLON,	/* "::". */
78    FFELEX_typeREL_LE,		/* "<=". */
79    FFELEX_typeREL_NE,		/* "<>". */
80    FFELEX_typeREL_EQ,		/* "==". */
81    FFELEX_typePOINTS,		/* "=>". */
82    FFELEX_typeREL_GE,		/* ">=". */
83    FFELEX_type
84  } ffelexType;
85
86/* Typedefs. */
87
88typedef struct _lextoken_ *ffelexToken;
89typedef void *lex_sigh_;
90typedef lex_sigh_ (*lex_sigh__) (ffelexToken);
91typedef lex_sigh__ (*ffelexHandler) (ffelexToken);
92
93/* Include files needed by this one. */
94
95#include "top.h"
96#include "where.h"
97
98/* Structure definitions. */
99
100struct _lextoken_
101  {
102    long int id_;		/* DEBUG ONLY. */
103    ffeTokenLength size;
104    ffeTokenLength length;
105    unsigned short uses;
106    char *text;
107    ffelexType type;
108    ffewhereLine where_line;
109    ffewhereColumn where_col;
110    ffewhereLine currentnames_line;	/* For tracking NAMES tokens. */
111    ffewhereColumn currentnames_col;	/* For tracking NAMES tokens. */
112    ffewhereTrack wheretrack;	/* For tracking NAMES tokens. */
113  };
114
115/* Global objects accessed by users of this module. */
116
117
118/* Declare functions with prototypes. */
119
120void ffelex_display_token (ffelexToken t);
121bool ffelex_expecting_character (void);
122ffelexHandler ffelex_file_fixed (ffewhereFile wf, FILE *f);
123ffelexHandler ffelex_file_free (ffewhereFile wf, FILE *f);
124void ffelex_hash_kludge (FILE *f);
125void ffelex_init_1 (void);
126bool ffelex_is_names_expected (void);
127char *ffelex_line (void);
128ffewhereColumnNumber ffelex_line_length (void);
129ffewhereLineNumber ffelex_line_number (void);
130void ffelex_set_expecting_hollerith (long length, char which,
131				     ffewhereLine line,
132				     ffewhereColumn column);
133void ffelex_set_handler (ffelexHandler first);
134void ffelex_set_hexnum (bool on);
135void ffelex_set_include (ffewhereFile wf, bool free_form, FILE *fi);
136void ffelex_set_names (bool on);
137void ffelex_set_names_pure (bool on);
138ffelexHandler ffelex_splice_tokens (ffelexHandler first, ffelexToken master,
139				    ffeTokenLength start);
140ffelexHandler ffelex_swallow_tokens (ffelexToken t, ffelexHandler handler);
141ffelexToken ffelex_token_dollar_from_names (ffelexToken t,
142					    ffeTokenLength start);
143void ffelex_token_kill (ffelexToken t);
144ffelexToken ffelex_token_name_from_names (ffelexToken t,
145					  ffeTokenLength start,
146					  ffeTokenLength len);
147ffelexToken ffelex_token_names_from_names (ffelexToken t,
148					   ffeTokenLength start,
149					   ffeTokenLength len);
150ffelexToken ffelex_token_new (void);
151ffelexToken ffelex_token_new_character (const char *s, ffewhereLine l,
152					ffewhereColumn c);
153ffelexToken ffelex_token_new_eof (void);
154ffelexToken ffelex_token_new_name (const char *s, ffewhereLine l,
155				   ffewhereColumn c);
156ffelexToken ffelex_token_new_names (const char *s, ffewhereLine l,
157				    ffewhereColumn c);
158ffelexToken ffelex_token_new_number (const char *s, ffewhereLine l,
159				     ffewhereColumn c);
160ffelexToken ffelex_token_new_simple_ (ffelexType type, ffewhereLine l,
161				      ffewhereColumn c);
162ffelexToken ffelex_token_number_from_names (ffelexToken t,
163					    ffeTokenLength start);
164ffelexToken ffelex_token_uscore_from_names (ffelexToken t,
165					    ffeTokenLength start);
166ffelexToken ffelex_token_use (ffelexToken t);
167
168/* Define macros. */
169
170#define ffelex_init_0()
171#define ffelex_init_2()
172#define ffelex_init_3()
173#define ffelex_init_4()
174#define ffelex_is_firstnamechar(c) \
175  (ISALPHA ((c)) || ((c) == '_'))
176#define ffelex_terminate_0()
177#define ffelex_terminate_1()
178#define ffelex_terminate_2()
179#define ffelex_terminate_3()
180#define ffelex_terminate_4()
181#define ffelex_token_length(t) ((t)->length)
182#define ffelex_token_new_eos(l,c) \
183  ffelex_token_new_simple_ (FFELEX_typeEOS, (l), (c))
184#define ffelex_token_new_period(l,c) \
185  ffelex_token_new_simple_ (FFELEX_typePERIOD, (l), (c))
186#define ffelex_token_strcmp(t1,t2) strcmp ((t1)->text, (t2)->text)
187#define ffelex_token_text(t) ((t)->text)
188#define ffelex_token_type(t) ((t)->type)
189#define ffelex_token_where_column(t) ((t)->where_col)
190#define ffelex_token_where_filename(t) \
191  ffewhere_line_filename ((t)->where_line)
192#define ffelex_token_where_filelinenum(t) \
193  ffewhere_line_filelinenum((t)->where_line)
194#define ffelex_token_where_line(t) ((t)->where_line)
195#define ffelex_token_where_line_number(t) \
196  ffewhere_line_number ((t)->where_line)
197#define ffelex_token_wheretrack(t) ((t)->wheretrack)
198
199/* End of #include file. */
200
201#endif
202