summaryrefslogtreecommitdiff
path: root/src/parser/pl.ypp
blob: e7d752419f377609576173159348a63380e61d2d (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
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
/*********************                                           -*- C++ -*-  */
/** pl.ypp
 ** 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.
 **
 ** This file contains the bison code for the parser that reads in CVC
 ** commands in the presentation language (hence "PL").
 **/

%{

#include "cvc4.h"
#include "cvc4_expr.h"
#include "parser/parser_exception.h"
#include "parser/parser_state.h"
#include "expr/expr_builder.h"
#include "expr/expr_manager.h"
#include "util/command.h"
//#include "rational.h"

// Exported shared data
namespace CVC4 {
  namespace parser {
    extern ParserState* parserState;
  }/* CVC4::parser namespace */
}/* CVC4 hnamespace */

// Define shortcuts for various things
// #define TMP CVC4::parser::parserState
// #define EXPR CVC4::parser::parserState->expr
// #define VC (CVC4::parser::parserState->vc)
#define EM (CVC4::parser::parserState->exprManager)
// #define RAT(args) CVC4::newRational args

// Suppress the bogus warning suppression in bison (it generates
// compile error)
#undef __GNUC_MINOR__

/* stuff that lives in PL.lex */
extern int PLlex(void);

int PLerror(const char *s)
{
  std::ostringstream ss;
  ss << CVC4::parser::parserState->fileName << ":" << CVC4::parser::parserState->lineNum
     << ": " << s;
  return CVC4::parser::parserState->error(ss.str());
}

#define YYLTYPE_IS_TRIVIAL 1
#define YYMAXDEPTH 10485760
/* Prefer YYERROR_VERBOSE over %error-verbose to avoid errors in older bison */
#define YYERROR_VERBOSE 1

using namespace CVC4;

%}

%union {
  std::string *str;
  CVC4::Expr *expr;
  CVC4::Command *cmd;
  std::vector<CVC4::Expr> *vec;
  int kind;
};


%start cmd
 // %start Query

/* strings are for better error messages.  
   "_TOK" is so macros don't conflict with kind names */

%token  DISTINCT_TOK    "DISTINCT"
%token	AND_TOK			"AND"
%token	ARRAY_TOK		"ARRAY"
%token	BOOLEAN_TOK		"BOOLEAN"
%token	DATATYPE_TOK		"DATATYPE"
%token	ELSE_TOK		"ELSE"
%token	ELSIF_TOK		"ELSIF"
%token	END_TOK			"END"
%token	ENDIF_TOK		"ENDIF"
%token	EXISTS_TOK		"EXISTS"
%token	FALSELIT_TOK		"FALSE"
%token	FORALL_TOK		"FORALL"
%token	IN_TOK			"IN"
%token	IF_TOK			"IF"
%token	LAMBDA_TOK		"LAMBDA"
%token	SIMULATE_TOK		"SIMULATE"
%token	LET_TOK			"LET"
%token	NOT_TOK			"NOT"
%token	IS_INTEGER_TOK		"IS_INTEGER"
%token	OF_TOK			"OF"
%token	OR_TOK			"OR"
%token	REAL_TOK		"REAL"
%token  INT_TOK                 "INT"
%token  SUBTYPE_TOK             "SUBTYPE"
%token  BITVECTOR_TOK           "BITVECTOR"
%token	THEN_TOK		"THEN"
%token	TRUELIT_TOK		"TRUE"
%token	TYPE_TOK		"TYPE"
%token	WITH_TOK		"WITH"
%token	XOR_TOK			"XOR"
%token	TCC_TOK			"TCC"
%token	PATTERN_TOK		"PATTERN"
%token '_'
%token  DONE_TOK

%token	DOTDOT_TOK		".."
%token	ASSIGN_TOK		":="
%token	NEQ_TOK			"/="
%token	IMPLIES_TOK		"=>"
%token	IFF_TOK			"<=>"
%token	PLUS_TOK		"+"
%token	MINUS_TOK		"-"
%token	MULT_TOK		"*"
%token	POW_TOK			"^"
%token	DIV_TOK			"/"
%token	MOD_TOK			"MOD"
%token	INTDIV_TOK		"DIV"
%token	LT_TOK			"<"
%token	LE_TOK			"<="
%token	GT_TOK			">"
%token	GE_TOK			">="
%token  FLOOR_TOK               "FLOOR"
%token  LEFTSHIFT_TOK            "<<"
%token  RIGHTSHIFT_TOK           ">>"
%token  BVPLUS_TOK              "BVPLUS"
%token  BVSUB_TOK               "BVSUB"
%token  BVUDIV_TOK              "BVUDIV"
%token  BVSDIV_TOK              "BVSDIV"
%token  BVUREM_TOK              "BVUREM"
%token  BVSREM_TOK              "BVSREM"
%token  BVSMOD_TOK              "BVSMOD"
%token  BVSHL_TOK               "BVSHL"
%token  BVASHR_TOK              "BVASHR"
%token  BVLSHR_TOK              "BVLSHR"
%token  BVUMINUS_TOK            "BVUMINUS"
%token  BVMULT_TOK              "BVMULT"
%token	SQHASH_TOK		"[#"
%token	HASHSQ_TOK		"#]"
%token	PARENHASH_TOK		"(#"
%token	HASHPAREN_TOK		"#)"
%token	ARROW_TOK		"->"
%token  BVNEG_TOK               "~"
%token  BVAND_TOK               "&"
%token  MID_TOK                 "|"
%token  BVXOR_TOK               "BVXOR"
%token  BVNAND_TOK              "BVNAND"
%token  BVNOR_TOK               "BVNOR"
%token  BVCOMP_TOK              "BVCOMP"
%token  BVXNOR_TOK              "BVXNOR"
%token  CONCAT_TOK              "@"
%token  BVTOINT_TOK             "BVTOINT"
%token  INTTOBV_TOK             "INTTOBV"
%token  BOOLEXTRACT_TOK         "BOOLEXTRACT"
%token  BVLT_TOK                "BVLT"
%token  BVGT_TOK                "BVGT"
%token  BVLE_TOK                "BVLE"
%token  BVGE_TOK                "BVGE"
%token  SX_TOK                  "SX"
%token  BVZEROEXTEND_TOK        "BVZEROEXTEND"
%token  BVREPEAT_TOK            "BVREPEAT"
%token  BVROTL_TOK              "BVROTL"
%token  BVROTR_TOK              "BVROTR"
%token  BVSLT_TOK               "BVSLT"
%token  BVSGT_TOK               "BVSGT"
%token  BVSLE_TOK               "BVSLE"
%token  BVSGE_TOK               "BVSGE"


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

%nonassoc ASSIGN_TOK IN_TOK
%nonassoc FORALL_TOK EXISTS_TOK
%left IFF_TOK
%right IMPLIES_TOK
%left OR_TOK XOR_TOK 
%left AND_TOK
%left NOT_TOK

%nonassoc '=' NEQ_TOK
%nonassoc LE_TOK LT_TOK GE_TOK GT_TOK FLOOR_TOK
%left PLUS_TOK MINUS_TOK
%left MULT_TOK INTDIV_TOK DIV_TOK MOD_TOK
%left POW_TOK
%left WITH_TOK
%left UMINUS_TOK
%left CONCAT_TOK
%left MID_TOK
%left BVAND_TOK
%left BVXOR_TOK
%left BVNAND_TOK
%left BVNOR_TOK BVCOMP_TOK
%left BVXNOR_TOK
%left BVNEG_TOK
%left BVUMINUS_TOK BVPLUS_TOK BVSUB_TOK 
%left BVUDIV_TOK BVSDIV_TOK BVUREM_TOK BVSREM_TOK BVSMOD_TOK BVSHL_TOK BVASHR_TOK BVLSHR_TOK
%left SX_TOK BVZEROEXTEND_TOK BVREPEAT_TOK BVROTL_TOK BVROTR_TOK
%left LEFTSHIFT_TOK RIGHTSHIFT_TOK
%nonassoc BVLT_TOK BVLE_TOK BVGT_TOK BVGE_TOK 
%nonassoc BVSLT_TOK BVSLE_TOK BVSGT_TOK BVSGE_TOK 
%right IS_INTEGER_TOK
%left ARROW_TOK

%nonassoc '[' 
%nonassoc '{' '.' '('
%nonassoc BITVECTOR_TOK

// %type <vec> FieldDecls TypeList IDs reverseIDs SingleDataTypes Constructors
// %type <vec> LetDecls TypeLetDecls BoundVarDecls ElseRest VarDecls 
// %type <vec> Exprs AndExpr OrExpr Pattern Patterns
// %type <vec> RecordEntries UpdatePosition Updates

// %type <node> Type /* IndexType */ TypeNotIdentifier TypeDef
// %type <node> DataType SingleDataType Constructor
// %type <node> FunctionType RecordType Real Int BitvectorType
// %type <node> FieldDecl TupleType
// %type <node> ArrayType ScalarType SubType BasicType SubrangeType 
// %type <node> LeftBound RightBound
%type <expr> Expr // Conditional UpdatePositionNode Update Lambda
// %type <node> QuantExpr ArrayLiteral RecordLiteral RecordEntry TupleLiteral 
// %type <node> LetDecl LetExpr LetDeclsNode 
// %type <node> TypeLetDecl TypeLetExpr TypeLetDeclsNode
// %type <node> BoundVarDecl BoundVarDeclNode VarDecl
// %type <node> ConstDecl TypeDecl 
 // %type <expr> Identifier // StringLiteral Numeral Binary Hex

%type <cmd> cmd /// Assert Query Help Dbg Trace Option  
// %type <node> Transform Print Call Echo DumpCommand
// %type <node> Include Where Push Pop PopTo
// %type <node> Context Forget Get_Child Get_Op Get_Type Check_Type Substitute
// %type <node> other_cmd
// %type <node> Arith_Var_Order

%token <str> ID_TOK STRINGLIT_TOK NUMERAL_TOK HEX_TOK BINARY_TOK

%%

cmd:       
    ASSERT_TOK Expr { 
      $$ = new AssertCommand(*$2);
      delete $2;
    } 
  | QUERY_TOK Expr { 
      $$ = new QueryCommand(*$2);
      delete $2;
    }
  | CHECKSAT_TOK Expr {
      $$ = new CheckSatCommand(*$2);
      delete $2;
    }
  | CHECKSAT_TOK {
      $$ = new CheckSatCommand();
    } ;

Expr:	
//    Identifier { $$ = $1; }
//  | 
    TRUELIT_TOK {
      $$ = new Expr(EM->mkExpr(TRUE));
    }
  | FALSELIT_TOK {
      $$ = new Expr(EM->mkExpr(FALSE));
    }
  | Expr OR_TOK Expr {
      $$ = new Expr(EM->mkExpr(OR, *$1, *$3));
      delete $1;
      delete $3;
    } 
  | Expr AND_TOK Expr {
      $$ = new Expr(EM->mkExpr(AND, *$1, *$3));
      delete $1;
      delete $3;
    } 
  | Expr IMPLIES_TOK Expr {
      $$ = new Expr(EM->mkExpr(IMPLIES, *$1, *$3));
      delete $1;
      delete $3;
    }
  | Expr IFF_TOK Expr {
      $$ = new Expr(EM->mkExpr(IFF, *$1, *$3));
      delete $1;
      delete $3;
    } 
  | NOT_TOK Expr {
      $$ = new Expr(EM->mkExpr(NOT, *$2));
      delete $2;
    } ;


// Identifier:
//     ID_TOK {
//         $$ = EM->mkExpr(VARIABLE, *$1);
//         delete $1;
//     }

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