summaryrefslogtreecommitdiff
path: root/src/parser/pl_scanner.lpp
blob: b7b27c4b06bb616afb675a6b66026174d7981379 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
/*********************                                           -*- C++ -*-  */
/** pl_scanner.lpp
 ** This file is part of the CVC4 prototype.
 ** Copyright (c) 2009 The Analysis of Computer Systems Group (ACSys)
 ** Courant Institute of Mathematical Sciences
 ** New York University
 ** See the file COPYING in the top-level source directory for licensing
 ** information.
 **
 ** CVC4 presentation language lexer.
 **/

%option interactive
%option noyywrap
%option nounput
%option noreject
%option noyymore
%option yylineno
%option prefix="PL"

%{

#include <list>
#include <vector>
#include <iostream>

#include "expr/expr_manager.h" /* for the benefit of parsePL_defs.h */
#include "util/command.h"
#include "parser/parser_state.h"
#include "parser/pl.hpp"
#include "util/debug.h"

namespace CVC4 {
  namespace parser {
    extern ParserState* _global_parser_state;
  }/* CVC4::parser namespace */
}/* CVC4 namespace */

extern int PL_inputLine;
extern char *PLtext;

extern int PLerror(const char *msg);

static int PLinput(std::istream& is, char* buf, int size) {
  int res;
  if(is) {
    // If interactive, read line by line; otherwise read as much as we
    // can gobble
    if(CVC4::parser::_global_parser_state->interactive()) {
      // Print the current prompt
      std::cout << CVC4::parser::_global_parser_state->getCurrentPrompt() << std::flush;
      // Set the prompt to "middle of the command" one
      CVC4::parser::_global_parser_state->setPromptNextLine();
      // Read the line
      is.getline(buf, size - 1);
    } else // Set the terminator char to 0
      is.getline(buf, size - 1, 0);
    // If failbit is set, but eof is not, it means the line simply
    // didn't fit; so we clear the state and keep on reading.
    bool partialStr = is.fail() && !is.eof();
    if(partialStr)
      is.clear();

    for(res = 0; res < size && buf[res] != 0; ++res)
      ;

    if(res == size)
      PLerror("Lexer bug: overfilled the buffer");

    if(!partialStr) { // Insert \n into the buffer
      buf[res++] = '\n';
      buf[res] = '\0';
    }
  } else {
    res = YY_NULL;
  }
  return res;
}

// Redefine the input buffer function to read from an istream
#define YY_INPUT(buffer, result, max_size) result = CVC4::parser::_global_parser_state->read(buffer, max_size);

int PL_bufSize() { return YY_BUF_SIZE; }
YY_BUFFER_STATE PL_buf_state() { return YY_CURRENT_BUFFER; }

/* some wrappers for methods that need to refer to a struct.
   These are used by CVC4::Parser. */
void *PL_createBuffer(int sz) {
  return (void *)PL_create_buffer(NULL, sz);
}
void PL_deleteBuffer(void *buf_state) {
  PL_delete_buffer((struct yy_buffer_state *)buf_state);
}
void PL_switchToBuffer(void *buf_state) {
  PL_switch_to_buffer((struct yy_buffer_state *)buf_state);
}
void *PL_bufState() {
  return (void *)PL_buf_state();
}

void PL_setInteractive(bool is_interactive) {
  yy_set_interactive(is_interactive);
}

// File-static (local to this file) variables and functions
static std::string _string_lit;

 static char escapeChar(char c) {
   switch(c) {
   case 'n': return '\n';
   case 't': return '\t';
   default: return c;
   }
 }

// for now, we don't have subranges.  
//
// ".."		{ return DOTDOT_TOK; }
/*OPCHAR	(['!#?\_$&\|\\@])*/

%}

%x	COMMENT
%x	STRING_LITERAL

LETTER	([a-zA-Z])
HEX     ([0-9a-fA-F])
BITS    ([0-1])
DIGIT	([0-9])
OPCHAR	(['?\_$~])
ANYTHING ({LETTER}|{DIGIT}|{OPCHAR})

%%

[\n]            { CVC4::parser::_global_parser_state->increaseLineNumber(); }

[ \t\r\f]	{ /* skip whitespace */ }

0bin{BITS}+	{PLlval.str = new std::string(PLtext+4);return BINARY_TOK; 
		}
0hex{HEX}+      {PLlval.str = new std::string(PLtext+4);return HEX_TOK; 
		}
{DIGIT}+	{PLlval.str = new std::string(PLtext);return NUMERAL_TOK; 
		}

"%"		{ BEGIN COMMENT; }
<COMMENT>"\n"	{ BEGIN INITIAL; /* return to normal mode */ 
                  CVC4::parser::_global_parser_state->increaseLineNumber(); }
<COMMENT>.	{ /* stay in comment mode */ }

<INITIAL>"\""		{ BEGIN STRING_LITERAL; 
                          _string_lit.erase(_string_lit.begin(),
                                            _string_lit.end()); }
<STRING_LITERAL>"\\".	{ /* escape characters (like \n or \") */
                          _string_lit.insert(_string_lit.end(),
                                             escapeChar(PLtext[1])); }
<STRING_LITERAL>"\""	{ BEGIN INITIAL; /* return to normal mode */ 
			  PLlval.str = new std::string(_string_lit);
                          return STRINGLIT_TOK; }
<STRING_LITERAL>.	{ _string_lit.insert(_string_lit.end(),*PLtext); }

[()[\]{},.;:'!#?_=]	{ return PLtext[0]; }

".."            { return DOTDOT_TOK; }
":="		{ return ASSIGN_TOK; }
"/="		{ return NEQ_TOK; }
"=>"		{ return IMPLIES_TOK; }
"<=>"		{ return IFF_TOK; }
"+"		{ return PLUS_TOK; }
"-"		{ return MINUS_TOK; }
"*"		{ return MULT_TOK; }
"^"		{ return POW_TOK; }
"/"		{ return DIV_TOK; }
"MOD"		{ return MOD_TOK; }
"DIV"		{ return INTDIV_TOK; }
"<"		{ return LT_TOK; }
"<="		{ return LE_TOK; }
">"		{ return GT_TOK; }
">="		{ return GE_TOK; }
"FLOOR"         { return FLOOR_TOK; }

"[#"		{ return SQHASH_TOK; }
"#]"		{ return HASHSQ_TOK; }
"(#"		{ return PARENHASH_TOK; }
"#)"		{ return HASHPAREN_TOK; }
"->"		{ return ARROW_TOK; }
"ARROW"		{ return ARROW_TOK; }
"@"             { return CONCAT_TOK;}
"~"             { return BVNEG_TOK;}
"&"             { return BVAND_TOK;}
"|"             { return MID_TOK;}
"BVXOR"         { return BVXOR_TOK;}
"BVNAND"        { return BVNAND_TOK;}
"BVNOR"         { return BVNOR_TOK;}
"BVCOMP"        { return BVCOMP_TOK;}
"BVXNOR"        { return BVXNOR_TOK;}
"<<"            { return LEFTSHIFT_TOK;}
">>"            { return RIGHTSHIFT_TOK;}
"BVSLT"         { return BVSLT_TOK;}
"BVSGT"         { return BVSGT_TOK;}
"BVSLE"         { return BVSLE_TOK;}
"BVSGE"         { return BVSGE_TOK;}
"SX"            { return SX_TOK;} 
"BVZEROEXTEND"  { return BVZEROEXTEND_TOK;} 
"BVREPEAT"      { return BVREPEAT_TOK;} 
"BVROTL"        { return BVROTL_TOK;} 
"BVROTR"        { return BVROTR_TOK;} 
"BVLT"          { return BVLT_TOK;}
"BVGT"          { return BVGT_TOK;}
"BVLE"          { return BVLE_TOK;}
"BVGE"          { return BVGE_TOK;}

"DISTINCT"      { return DISTINCT_TOK; }
"BVTOINT"       { return BVTOINT_TOK;}
"INTTOBV"       { return INTTOBV_TOK;}
"BOOLEXTRACT"   { return BOOLEXTRACT_TOK;}
"BVPLUS"        { return BVPLUS_TOK;}
"BVUDIV"        { return BVUDIV_TOK;}
"BVSDIV"        { return BVSDIV_TOK;}
"BVUREM"        { return BVUREM_TOK;}
"BVSREM"        { return BVSREM_TOK;}
"BVSMOD"        { return BVSMOD_TOK;}
"BVSHL"         { return BVSHL_TOK;}
"BVASHR"        { return BVASHR_TOK;}
"BVLSHR"        { return BVLSHR_TOK;}
"BVSUB"         { return BVSUB_TOK;}
"BVUMINUS"      { return BVUMINUS_TOK;}
"BVMULT"        { return BVMULT_TOK;}
"AND"		{ return AND_TOK; }
"ARRAY"		{ return ARRAY_TOK; }
"BOOLEAN"	{ return BOOLEAN_TOK; }
"DATATYPE"	{ return DATATYPE_TOK; }
"ELSE"		{ return ELSE_TOK; }
"ELSIF"		{ return ELSIF_TOK; }
"END"		{ return END_TOK; }
"ENDIF"		{ return ENDIF_TOK; }
"EXISTS"	{ return EXISTS_TOK; }
"FALSE"		{ return FALSELIT_TOK; }
"FORALL"	{ return FORALL_TOK; }
"IF"		{ return IF_TOK; }
"IN"		{ return IN_TOK; }
"LAMBDA"	{ return LAMBDA_TOK; }
"SIMULATE"	{ return SIMULATE_TOK; }
"LET"		{ return LET_TOK; }
"NOT"		{ return NOT_TOK; }
"IS_INTEGER"	{ return IS_INTEGER_TOK; }
"OF"		{ return OF_TOK; }
"OR"		{ return OR_TOK; }
"REAL"		{ return REAL_TOK; }
"INT"           { return INT_TOK;}
"SUBTYPE"       { return SUBTYPE_TOK;}
"BITVECTOR"     { return BITVECTOR_TOK;}

"THEN"		{ return THEN_TOK; }
"TRUE"		{ return TRUELIT_TOK; }
"TYPE"		{ return TYPE_TOK; }
"WITH"		{ return WITH_TOK; }
"XOR"		{ return XOR_TOK; }
"TCC"		{ return TCC_TOK; }
"PATTERN"       { return PATTERN_TOK; }

"ARITH_VAR_ORDER" { return ARITH_VAR_ORDER_TOK; }
"ASSERT"	{ return ASSERT_TOK; }
"QUERY"	        { return QUERY_TOK; }
"CHECKSAT"      { return CHECKSAT_TOK; }
"CONTINUE"      { return CONTINUE_TOK; }
"RESTART"       { return RESTART_TOK; }
"DBG"	        { return DBG_TOK; }
"TRACE"	        { return TRACE_TOK; }
"UNTRACE"       { return UNTRACE_TOK; }
"OPTION"        { return OPTION_TOK; }
"HELP"	        { return HELP_TOK; }
"TRANSFORM"	{ return TRANSFORM_TOK; }
"PRINT"	        { return PRINT_TOK; }
"PRINT_TYPE"    { return PRINT_TYPE_TOK; }
"CALL"	        { return CALL_TOK; }
"ECHO"	        { return ECHO_TOK; }
"INCLUDE"       { return INCLUDE_TOK; }
"DUMP_ASSUMPTIONS"   { return DUMP_ASSUMPTIONS_TOK; }
"DUMP_PROOF"    { return DUMP_PROOF_TOK; }
"DUMP_SIG"      { return DUMP_SIG_TOK; }
"DUMP_TCC"      { return DUMP_TCC_TOK; }
"DUMP_TCC_ASSUMPTIONS" { return DUMP_TCC_ASSUMPTIONS_TOK; }
"DUMP_TCC_PROOF" { return DUMP_TCC_PROOF_TOK; }
"DUMP_CLOSURE"  { return DUMP_CLOSURE_TOK; }
"DUMP_CLOSURE_PROOF" { return DUMP_CLOSURE_PROOF_TOK; }
"WHERE"         { return WHERE_TOK; }
"ASSERTIONS"    { return ASSERTIONS_TOK; }
"ASSUMPTIONS"   { return ASSUMPTIONS_TOK; }
"COUNTEREXAMPLE" { return COUNTEREXAMPLE_TOK; }
"COUNTERMODEL"  { return COUNTERMODEL_TOK; }
"PUSH"          { return PUSH_TOK; }
"POP"           { return POP_TOK; }
"POPTO"         { return POPTO_TOK; }
"PUSH_SCOPE"    { return PUSH_SCOPE_TOK; }
"POP_SCOPE"     { return POP_SCOPE_TOK; }
"POPTO_SCOPE"   { return POPTO_SCOPE_TOK; }
"RESET"         { return RESET_TOK; }
"CONTEXT"       { return CONTEXT_TOK; }
"FORGET"        { return FORGET_TOK; }
"GET_TYPE"      { return GET_TYPE_TOK; }
"CHECK_TYPE"    { return CHECK_TYPE_TOK; }
"GET_CHILD"     { return GET_CHILD_TOK; }
"GET_OP"        { return GET_OP_TOK; }
"SUBSTITUTE"    { return SUBSTITUTE_TOK; }

(({LETTER})|(_)({ANYTHING}))({ANYTHING})* {  PLlval.str = new std::string(PLtext); return ID_TOK; }

<<EOF>>                                 { return DONE_TOK; }

. { PLerror("Illegal input character."); }
%%

generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback