1282b6946b732e451ca080cd3b1cf50e621557a1
[pspp] / src / language / lexer / lexer.h
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 1997-9, 2000, 2010, 2011, 2013, 2014 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #ifndef LEXER_H
18 #define LEXER_H 1
19
20 #include <stdbool.h>
21 #include <stddef.h>
22 #include <unistd.h>
23
24 #include "data/identifier.h"
25 #include "data/variable.h"
26 #include "language/lexer/segment.h"
27 #include "libpspp/cast.h"
28 #include "libpspp/compiler.h"
29 #include "libpspp/prompt.h"
30
31 struct lexer;
32 struct macro;
33
34 /* Handling of errors. */
35 enum lex_error_mode
36   {
37     LEX_ERROR_TERMINAL,        /* Discard input line and continue reading. */
38     LEX_ERROR_CONTINUE,        /* Continue to next command, except for
39                                   cascading failures. */
40     LEX_ERROR_STOP             /* Stop processing. */
41   };
42
43 /* Reads a single syntax file as a stream of bytes encoded in UTF-8.
44
45    Not opaque. */
46 struct lex_reader
47   {
48     const struct lex_reader_class *class;
49     enum segmenter_mode syntax;
50     enum lex_error_mode error;
51     char *encoding;
52     char *file_name;            /* NULL if not associated with a file. */
53     int line_number;            /* 1-based initial line number, 0 if none. */
54     bool eof;
55   };
56
57 /* An implementation of a lex_reader. */
58 struct lex_reader_class
59   {
60     /* Reads up to N bytes of data from READER into N.  Returns the positive
61        number of bytes read if successful, or zero at end of input or on
62        error.
63
64        STYLE provides a hint to interactive readers as to what kind of syntax
65        is being read right now. */
66     size_t (*read) (struct lex_reader *reader, char *buf, size_t n,
67                     enum prompt_style style);
68
69     /* Closes and destroys READER, releasing any allocated storage.
70
71        The caller will free the 'file_name' member of READER, so the
72        implementation should not do so. */
73     void (*destroy) (struct lex_reader *reader);
74   };
75
76 /* Helper functions for lex_reader. */
77 void lex_reader_init (struct lex_reader *, const struct lex_reader_class *);
78 void lex_reader_set_file_name (struct lex_reader *, const char *file_name);
79
80 /* Creating various kinds of lex_readers. */
81 struct lex_reader *lex_reader_for_file (const char *file_name,
82                                         const char *encoding,
83                                         enum segmenter_mode syntax,
84                                         enum lex_error_mode error);
85 struct lex_reader *lex_reader_for_string (const char *, const char *encoding);
86 struct lex_reader *lex_reader_for_format (const char *, const char *, ...)
87   PRINTF_FORMAT (1, 3);
88 struct lex_reader *lex_reader_for_substring_nocopy (struct substring, const char *encoding);
89
90 /* Initialization. */
91 struct lexer *lex_create (void);
92 void lex_destroy (struct lexer *);
93
94 /* Macros. */
95 void lex_define_macro (struct lexer *, struct macro *);
96
97 /* Files. */
98 void lex_include (struct lexer *, struct lex_reader *);
99 void lex_append (struct lexer *, struct lex_reader *);
100
101 /* Advancing. */
102 void lex_get (struct lexer *);
103 void lex_get_n (struct lexer *, size_t n);
104
105 /* Token testing functions. */
106 bool lex_is_number (const struct lexer *);
107 double lex_number (const struct lexer *);
108 bool lex_is_integer (const struct lexer *);
109 long lex_integer (const struct lexer *);
110 bool lex_is_string (const struct lexer *);
111
112 /* Token testing functions with lookahead. */
113 bool lex_next_is_number (const struct lexer *, int n);
114 double lex_next_number (const struct lexer *, int n);
115 bool lex_next_is_integer (const struct lexer *, int n);
116 long lex_next_integer (const struct lexer *, int n);
117 bool lex_next_is_string (const struct lexer *, int n);
118
119 /* Token matching functions. */
120 bool lex_match (struct lexer *, enum token_type);
121 bool lex_match_id (struct lexer *, const char *);
122 bool lex_match_id_n (struct lexer *, const char *, size_t n);
123 bool lex_match_int (struct lexer *, int);
124 bool lex_at_phrase (struct lexer *, const char *s);
125 bool lex_match_phrase (struct lexer *, const char *s);
126
127 /* Forcible matching functions. */
128 bool lex_force_match (struct lexer *, enum token_type) WARN_UNUSED_RESULT;
129 bool lex_force_match_id (struct lexer *, const char *) WARN_UNUSED_RESULT;
130 bool lex_force_int (struct lexer *) WARN_UNUSED_RESULT;
131 bool lex_force_int_range (struct lexer *, const char *name,
132                           long min, long max) WARN_UNUSED_RESULT;
133 bool lex_force_num (struct lexer *) WARN_UNUSED_RESULT;
134 bool lex_force_id (struct lexer *) WARN_UNUSED_RESULT;
135 bool lex_force_string (struct lexer *) WARN_UNUSED_RESULT;
136 bool lex_force_string_or_id (struct lexer *) WARN_UNUSED_RESULT;
137
138 /* Token accessors. */
139 enum token_type lex_token (const struct lexer *);
140 double lex_tokval (const struct lexer *);
141 const char *lex_tokcstr (const struct lexer *);
142 struct substring lex_tokss (const struct lexer *);
143
144 /* Looking ahead. */
145 const struct token *lex_next (const struct lexer *, int n);
146 enum token_type lex_next_token (const struct lexer *, int n);
147 const char *lex_next_tokcstr (const struct lexer *, int n);
148 double lex_next_tokval (const struct lexer *, int n);
149 struct substring lex_next_tokss (const struct lexer *, int n);
150
151 /* Token representation. */
152 char *lex_next_representation (const struct lexer *, int n0, int n1);
153 bool lex_next_is_from_macro (const struct lexer *, int n);
154
155 /* Current position. */
156 int lex_get_first_line_number (const struct lexer *, int n);
157 int lex_get_last_line_number (const struct lexer *, int n);
158 int lex_get_first_column (const struct lexer *, int n);
159 int lex_get_last_column (const struct lexer *, int n);
160 const char *lex_get_file_name (const struct lexer *);
161 struct msg_location *lex_get_location (const struct lexer *, int n0, int n1);
162 struct msg_location *lex_get_lines (const struct lexer *, int n0, int n1);
163 const char *lex_get_encoding (const struct lexer *);
164
165 /* Issuing errors. */
166 void lex_error (struct lexer *, const char *, ...) PRINTF_FORMAT (2, 3);
167 void lex_next_error (struct lexer *, int n0, int n1, const char *, ...)
168   PRINTF_FORMAT (4, 5);
169 int lex_end_of_command (struct lexer *);
170
171 void lex_error_expecting (struct lexer *, ...) SENTINEL(0);
172 #define lex_error_expecting(...) \
173   lex_error_expecting(__VA_ARGS__, NULL_SENTINEL)
174 void lex_error_expecting_valist (struct lexer *, va_list);
175 void lex_error_expecting_array (struct lexer *, const char **, size_t n);
176
177 void lex_sbc_only_once (const char *);
178 void lex_sbc_missing (const char *);
179
180 void lex_spec_only_once (struct lexer *, const char *subcommand,
181                          const char *specification);
182 void lex_spec_missing (struct lexer *, const char *subcommand,
183                        const char *specification);
184
185 void lex_error_valist (struct lexer *, const char *, va_list)
186   PRINTF_FORMAT (2, 0);
187 void lex_next_error_valist (struct lexer *lexer, int n0, int n1,
188                             const char *format, va_list)
189   PRINTF_FORMAT (4, 0);
190
191 /* Error handling. */
192 enum segmenter_mode lex_get_syntax_mode (const struct lexer *);
193 enum lex_error_mode lex_get_error_mode (const struct lexer *);
194 void lex_discard_rest_of_command (struct lexer *);
195 void lex_interactive_reset (struct lexer *);
196 void lex_discard_noninteractive (struct lexer *);
197
198 #endif /* lexer.h */