[SMT-LIB] OCaml parser for SMT-LIB 2.0

Aaron Stump aaron-stump at uiowa.edu
Mon Aug 30 12:35:06 EDT 2010


Dear SMT-LIB community,

We are contributing an OCaml parser for SMT-LIB 2.0, which Kyle implemented
as part of an undergraduate research project this summer at Iowa with Aaron.
 The parser builds ASTs, and is generated from a high-level declarative
specification, included below and in the distribution.  You can download the
parser from:

http://www.cs.uiowa.edu/~astump/software/ocaml-smt2.zip

Cesare has looked through our grammar, and at this point, we believe it is
conformant to the SMT-LIB 2.0 standard.  That said, please let us know if
you find any bugs.

Thanks,
Aaron Stump and Kyle Krchak
The University of Iowa
-------------------------------------------------------------------------------------------------------
smtlib

line_comment = ";"

Commands : commands -> { command }*

CommandSetLogic : command -> LPAREN SETLOGIC symbol RPAREN
CommandSetOption : command -> LPAREN SETOPTION an_option RPAREN
CommandSetInfo : command -> LPAREN SETINFO attribute RPAREN
CommandDeclareSort : command -> LPAREN DECLARESORT symbol NUMERAL RPAREN
CommandDefineSort : command -> LPAREN DEFINESORT symbol LPAREN { symbol }*
RPAREN sort RPAREN
CommandDeclareFun : command -> LPAREN DECLAREFUN symbol LPAREN { sort }*
RPAREN sort RPAREN
CommandDefineFun : command -> LPAREN DEFINEFUN symbol LPAREN { sortedvar }*
RPAREN sort term RPAREN
CommandPush : command -> LPAREN PUSH NUMERAL RPAREN
CommandPop : command -> LPAREN POP NUMERAL RPAREN
CommandAssert : command -> LPAREN ASSERT term RPAREN
CommandCheckSat : command -> LPAREN CHECKSAT RPAREN
CommandGetAssert : command -> LPAREN GETASSERT RPAREN
CommandGetProof : command -> LPAREN GETPROOF RPAREN
CommandGetUnsatCore : command -> LPAREN GETUNSATCORE RPAREN
CommandGetValue : command -> LPAREN GETVALUE LPAREN { term }+ RPAREN RPAREN
CommandGetAssign : command -> LPAREN GETASSIGN RPAREN
CommandGetOption : command -> LPAREN GETOPTION KEYWORD RPAREN
CommandGetInfo : command -> LPAREN GETINFO infoflag RPAREN
CommandExit : command -> LPAREN EXIT RPAREN

Symbol : symbol -> SYMBOL
SymbolWithOr : symbol -> ASCIIWOR

VarBindingSymTerm : varbinding -> LPAREN symbol term RPAREN

SortIdentifier : sort -> identifier
SortIdSortMulti : sort -> LPAREN identifier { sort }+ RPAREN

SortedVarSymSort : sortedvar -> LPAREN symbol sort RPAREN

TermSpecConst : term -> specconstant
TermQualIdentifier : term -> qualidentifier
TermQualIdTerm : term -> LPAREN qualidentifier { term }+ RPAREN
TermLetTerm : term -> LPAREN LET LPAREN { varbinding }+ RPAREN term RPAREN
TermForAllTerm : term -> LPAREN FORALL LPAREN { sortedvar }+ RPAREN term
RPAREN
TermExistsTerm : term -> LPAREN EXISTS LPAREN { sortedvar }+ RPAREN term
RPAREN
TermExclimationPt : term -> LPAREN EXCLIMATIONPT term { attribute }+ RPAREN

QualIdentifierId : qualidentifier -> identifier
QualIdentifierAs : qualidentifier -> LPAREN AS identifier sort RPAREN

IdSymbol : identifier -> symbol
IdUnderscoreSymNum : identifier -> LPAREN UNDERSCORE symbol { NUMERAL }+
RPAREN

InfoFlagKeyword : infoflag -> KEYWORD
AnOptionAttribute : an_option -> attribute

AttributeKeyword : attribute -> KEYWORD
AttributeKeywordValue : attribute -> KEYWORD attributevalue
AttributeValSpecConst : attributevalue -> specconstant
AttributeValSymbol : attributevalue -> symbol
AttributeValSexpr : attributevalue -> LPAREN { sexpr }* RPAREN

SexprSpecConst : sexpr -> specconstant
SexprSymbol : sexpr -> symbol
SexprKeyword : sexpr -> KEYWORD
SexprInParen : sexpr -> LPAREN { sexpr }* RPAREN

SpecConstsDec : specconstant -> DECIMAL
SpecConstNum : specconstant -> NUMERAL
SpecConstString : specconstant -> STRINGLIT
SpecConstsHex : specconstant -> HEXADECIMAL
SpecConstsBinary : specconstant -> BINARY



UNDERSCORE = "_"
LPAREN = "("
RPAREN = ")"
AS = "as"
LET = "let"
FORALL = "forall"
EXISTS = "exists"
EXCLIMATIONPT = "!"
SETLOGIC = "set-logic"
SETOPTION = "set-option"
SETINFO = "set-info"
DECLARESORT = "declare-sort"
DEFINESORT = "define-sort"
DECLAREFUN = "declare-fun"
DEFINEFUN = "define-fun"
PUSH = "push"
POP = "pop"
ASSERT = "assert"
CHECKSAT = "check-sat"
GETASSERT = "get-assertions"
GETPROOF = "get-proof"
GETUNSATCORE = "get-unsat-core"
GETVALUE = "get-value"
GETASSIGN = "get-assignment"
GETOPTION = "get-option"
GETINFO = "get-info"
EXIT = "exit"


HEXADECIMAL = {{ '#' 'x' ['0'-'9' 'A'-'F' 'a'-'f']+ }}

BINARY = {{ '#' 'b' ['0'-'1']+ }}

ASCIIWOR = {{ '|' ([ '!'-'~' ' ' '\n' '\t' '\r'] # ['\\' '|'])* '|' }}

KEYWORD = {{ ':' ['a'-'z' 'A'-'Z' '0'-'9' '+' '-' '/' '*' '=' '%' '?' '!'
'.' '$' '_' '~' '&' '^' '<' '>' '@']+ }}

SYMBOL = {{ ['a'-'z' 'A'-'Z' '+' '-' '/' '*' '=''%' '?' '!' '.' '$' '_' '~'
'&' '^' '<' '>' '@'] ['a'-'z' 'A'-'Z' '0'-'9' '+' '-' '/' '*' '=''%' '?' '!'
'.' '$' '_' '~' '&' '^' '<' '>' '@']* }}

STRINGLIT = {{ '"' (([ '!'-'~' ' ' '\n' '\t' '\r' ] # ['\\' '"']) | ('\\'
['!'-'~' ' ' '\n' '\t' '\r'] ))* '"'}}

NUMERAL = {{ ( '0' | ['1'-'9'] ['0'-'9']* ) }}

DECIMAL = {{ ( '0' | ['1'-'9'] ['0'-'9']* ) '.' ['0'-'9']+}}


More information about the SMT-LIB mailing list