type token =
  | EOF
  | LPAR
  | RPAR
  | LSQU
  | RSQU
  | LCUR
  | RCUR
  | SADD
  | SSUB
  | SMUL
  | SDIV
  | SMOD
  | SAND
  | SOR
  | SXOR
  | SSHL
  | SSHR
  | SET
  | ADD
  | SUB
  | MUL
  | DIV
  | MOD
  | AND
  | OR
  | XOR
  | SHL
  | SHR
  | EQU
  | NEQ
  | LTE
  | LTN
  | GTE
  | GTN
  | LAND
  | LOR
  | NOT
  | TILDE
  | COLON
  | COMMA
  | SEMI
  | POINT
  | ARROW
  | INTEGER of (int32)
  | DRES of (Text.t)
  | STRING of (KeAst.strtokens)
  | LABEL of (string * Text.t)
  | IDENT of (string * Text.t)
  | GOTO of (string * Text.t)
  | VAR of (int)
  | SVAR of (int)
  | REG of (int)
  | INT of (int)
  | STR
  | DWITHEXPR of (string * [`Int | `Str | `None])
  | DEOF
  | DHALT
  | DTARGET
  | DVERSION
  | DLOAD
  | DIF
  | DELSE
  | DELSEIF
  | DENDIF
  | DFOR
  | DIFDEF of (bool)
  | DINLINE of (bool)
  | DDEFINE of ([`Define | `DefineScoped | `Redefine | `Const | `Bind | `EBind])
  | DSET
  | DUNDEF
  | DHIDING
  | OP
  | USCORE
  | RETURN
  | IF
  | ELSE
  | WHILE
  | REPEAT
  | TILL
  | FOR
  | CASE
  | OF
  | OTHER
  | ECASE
  | BREAK
  | CONTINUE
  | RAW
  | ENDRAW
  | GO_CASE of (string * Text.t)
  | GO_LIST of (string * Text.t)
  | SELECT of (string * int)
  | SPECIAL of ([ `S | `Pause ])

val program :
  (Lexing.lexbuf  -> token) -> Lexing.lexbuf -> KeAst.statement
val statement :
  (Lexing.lexbuf  -> token) -> Lexing.lexbuf -> KeAst.statement
val just_statements :
  (Lexing.lexbuf  -> token) -> Lexing.lexbuf -> KeAst.statement DynArray.t
val just_expression :
  (Lexing.lexbuf  -> token) -> Lexing.lexbuf -> KeAst.expression
val just_param_list :
  (Lexing.lexbuf  -> token) -> Lexing.lexbuf -> KeAst.parameter list
