/*
* This file is part of the Yices SMT Solver.
* Copyright (C) 2017 SRI International.
*
* Yices is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Yices is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Yices. If not, see .
*/
/*
* Lexer for Yices language with support for EF-solver
* - separators are ( ) : and spaces
*
* - strings are delimited by " with escaped char \n, \t, etc. allowed
*
* - two kinds of numeric literals are recognized
* TK_NUM_RATIONAL: /
* or
* TK_NUM_FLOAT:
* .
*
* .
*
* (the two formats recognized by string-to-rational conversions in rational.c)
*
* - bit-vector literals are written 0b (cf. bv_constants.c)
* or 0x
*
* - comments start with ; and extend to the end of the line
*
* 2013/12/12: added ef-solve token
* 2014/03: added export-to-dimancs and show-implicants
*/
#ifndef __YICES_LEXER_H
#define __YICES_LEXER_H
#include "parser_utils/lexer.h"
/*
* Tokens
*/
enum yices_token {
// commands
TK_DEFINE_TYPE, TK_DEFINE, TK_ASSERT, TK_CHECK, TK_CHECK_ASSUMING,
TK_PUSH, TK_POP, TK_RESET, TK_DUMP_CONTEXT, TK_EXIT,
TK_ECHO, TK_INCLUDE, TK_SHOW_MODEL, TK_EVAL, TK_SET_PARAM,
TK_SHOW_PARAM, TK_SHOW_PARAMS, TK_SHOW_STATS, TK_RESET_STATS,
TK_SET_TIMEOUT, TK_SHOW_TIMEOUT, TK_HELP, TK_EF_SOLVE,
TK_EXPORT_TO_DIMACS, TK_SHOW_IMPLICANT,
TK_SHOW_UNSAT_CORE, TK_SHOW_UNSAT_ASSUMPTIONS,
TK_SHOW_REDUCED_MODEL,
// term constructors
TK_UPDATE, TK_FORALL, TK_EXISTS, TK_LAMBDA, TK_LET,
// separators and end-of-stream
TK_LP, TK_RP, TK_COLON_COLON, TK_EOS,
// literals
TK_STRING, TK_NUM_RATIONAL, TK_NUM_FLOAT, TK_BV_CONSTANT, TK_HEX_CONSTANT,
// any symbol that's not a keyword
TK_SYMBOL,
// type keywords
TK_BOOL, TK_INT, TK_REAL, TK_BITVECTOR, TK_SCALAR, TK_TUPLE, TK_ARROW,
// term keywords
TK_TRUE, TK_FALSE, TK_IF, TK_ITE, TK_EQ, TK_DISEQ, TK_DISTINCT,
TK_OR, TK_AND, TK_NOT, TK_XOR, TK_IFF, TK_IMPLIES, TK_MK_TUPLE,
TK_SELECT, TK_UPDATE_TUPLE,
// arithmetic keywords
TK_ADD, TK_SUB, TK_MUL, TK_DIV, TK_POW, TK_LT, TK_LE, TK_GT, TK_GE,
// bitvector keywords
TK_MK_BV, TK_BV_ADD, TK_BV_SUB, TK_BV_MUL, TK_BV_NEG, TK_BV_POW,
TK_BV_NOT, TK_BV_AND, TK_BV_OR, TK_BV_XOR, TK_BV_NAND, TK_BV_NOR, TK_BV_XNOR,
TK_BV_SHIFT_LEFT0, TK_BV_SHIFT_LEFT1, TK_BV_SHIFT_RIGHT0,
TK_BV_SHIFT_RIGHT1, TK_BV_ASHIFT_RIGHT, TK_BV_ROTATE_LEFT, TK_BV_ROTATE_RIGHT,
TK_BV_EXTRACT, TK_BV_CONCAT, TK_BV_REPEAT,
TK_BV_SIGN_EXTEND, TK_BV_ZERO_EXTEND,
TK_BV_GE, TK_BV_GT, TK_BV_LE, TK_BV_LT,
TK_BV_SGE, TK_BV_SGT, TK_BV_SLE, TK_BV_SLT,
// more bitvector operators
TK_BV_SHL, TK_BV_LSHR, TK_BV_ASHR,
TK_BV_DIV, TK_BV_REM, TK_BV_SDIV, TK_BV_SREM, TK_BV_SMOD,
TK_BV_REDOR, TK_BV_REDAND, TK_BV_COMP,
// conversions between bitvectors and Booleans
TK_BOOL_TO_BV, TK_BIT,
// more arithmetic functions (inherited from SMT-LIB2 Ints theory)
TK_FLOOR, TK_CEIL, TK_ABS, TK_IDIV, TK_MOD, TK_DIVIDES, TK_IS_INT,
// unrecognized tokens or other errors
TK_OPEN_STRING, TK_EMPTY_BVCONST, TK_EMPTY_HEXCONST,
TK_INVALID_NUM, TK_ZERO_DIVISOR, TK_ERROR,
};
#define NUM_YICES_TOKENS (TK_ERROR+1)
typedef enum yices_token yices_token_t;
/*
* Lexer initialization:
* - for file_lexer, return code 0 means OK, negative code means error
* (can't open the file).
*/
extern int32_t init_yices_file_lexer(lexer_t *lex, char *filename);
extern void init_yices_stream_lexer(lexer_t *lex, FILE *f, char *name);
static inline void init_yices_stdin_lexer(lexer_t *lex) {
init_yices_stream_lexer(lex, stdin, "stdin");
}
extern void init_yices_string_lexer(lexer_t *lex, char *data, char *name);
/*
* Conversion from a token type to a string.
* The internal table is initialized by one of the
* init_yices_lexer functions. This function should not be
* called before the init function.
*/
extern char *yices_token_to_string(yices_token_t tk);
/*
* Read next token and return its type tk
* - set lex->token to tk
* - set lex->tk_pos, etc.
* - if token is TK_STRING, TK_NUM_RATIONAL, TK_NUM_FLOAT,
* TK_BV_CONSTANT, TK_SYMBOL, or TK_ERROR,
* the token value is set in lex->buffer.
*/
extern yices_token_t next_yices_token(lexer_t *lex);
#endif /* __YICE_LEXER_H */