sig
  type id = string
  type prefixOp =
    JavaScript_syntax.prefixOp =
      PrefixLNot
    | PrefixBNot
    | PrefixPlus
    | PrefixMinus
    | PrefixTypeof
    | PrefixVoid
    | PrefixDelete
  type unaryAssignOp =
    JavaScript_syntax.unaryAssignOp =
      PrefixInc
    | PrefixDec
    | PostfixInc
    | PostfixDec
  type infixOp =
    JavaScript_syntax.infixOp =
      OpLT
    | OpLEq
    | OpGT
    | OpGEq
    | OpIn
    | OpInstanceof
    | OpEq
    | OpNEq
    | OpStrictEq
    | OpStrictNEq
    | OpLAnd
    | OpLOr
    | OpMul
    | OpDiv
    | OpMod
    | OpSub
    | OpLShift
    | OpSpRShift
    | OpZfRShift
    | OpBAnd
    | OpBXor
    | OpBOr
    | OpAdd
  type assignOp =
    JavaScript_syntax.assignOp =
      OpAssign
    | OpAssignAdd
    | OpAssignSub
    | OpAssignMul
    | OpAssignDiv
    | OpAssignMod
    | OpAssignLShift
    | OpAssignSpRShift
    | OpAssignZfRShift
    | OpAssignBAnd
    | OpAssignBXor
    | OpAssignBOr
  type const =
    JavaScript_syntax.const =
      CString of string
    | CRegexp of string * bool * bool
    | CNum of float
    | CInt of int
    | CBool of bool
    | CNull
    | CUndefined
  type prop =
    JavaScript_syntax.prop =
      PropId of JavaScript.id
    | PropString of string
    | PropNum of int
  type varDecl =
    JavaScript_syntax.varDecl =
      VarDeclNoInit of JavaScript.id
    | VarDecl of JavaScript.id * JavaScript.expr
  and forInit =
    JavaScript_syntax.forInit =
      NoForInit
    | VarForInit of JavaScript.varDecl list
    | ExprForInit of JavaScript.expr
  and catch =
    JavaScript_syntax.catch =
      CatchClause of JavaScript.id * JavaScript.stmt
  and forInInit =
    JavaScript_syntax.forInInit =
      VarForInInit of JavaScript.id
    | NoVarForInInit of JavaScript.id
  and caseClause =
    JavaScript_syntax.caseClause =
      CaseClause of JavaScript.expr * JavaScript.stmt
    | CaseDefault of JavaScript.stmt
  and lvalue =
    JavaScript_syntax.lvalue =
      VarLValue of JavaScript.id
    | DotLValue of JavaScript.expr * JavaScript.id
    | BracketLValue of JavaScript.expr * JavaScript.expr
  and expr =
    JavaScript_syntax.expr =
      ConstExpr of JavaScript.const
    | ArrayExpr of JavaScript.expr list
    | ObjectExpr of (JavaScript.prop * JavaScript.expr) list
    | ThisExpr
    | VarExpr of JavaScript.id
    | DotExpr of JavaScript.expr * JavaScript.id
    | BracketExpr of JavaScript.expr * JavaScript.expr
    | NewExpr of JavaScript.expr * JavaScript.expr list
    | PrefixExpr of JavaScript.prefixOp * JavaScript.expr
    | UnaryAssignExpr of JavaScript.unaryAssignOp * JavaScript.lvalue
    | InfixExpr of JavaScript.infixOp * JavaScript.expr * JavaScript.expr
    | IfExpr of JavaScript.expr * JavaScript.expr * JavaScript.expr
    | AssignExpr of JavaScript.assignOp * JavaScript.lvalue * JavaScript.expr
    | ParenExpr of JavaScript.expr
    | ListExpr of JavaScript.expr * JavaScript.expr
    | CallExpr of JavaScript.expr * JavaScript.expr list
    | FuncExpr of JavaScript.id list * JavaScript.stmt
    | NamedFuncExpr of JavaScript.id * JavaScript.id list * JavaScript.stmt
  and stmt =
    JavaScript_syntax.stmt =
      BlockStmt of JavaScript.stmt list
    | EmptyStmt
    | ExprStmt of JavaScript.expr
    | IfStmt of JavaScript.expr * JavaScript.stmt * JavaScript.stmt
    | IfSingleStmt of JavaScript.expr * JavaScript.stmt
    | SwitchStmt of JavaScript.expr * JavaScript.caseClause list
    | WhileStmt of JavaScript.expr * JavaScript.stmt
    | DoWhileStmt of JavaScript.stmt * JavaScript.expr
    | BreakStmt
    | BreakToStmt of JavaScript.id
    | ContinueStmt
    | ContinueToStmt of JavaScript.id
    | LabelledStmt of JavaScript.id * JavaScript.stmt
    | ForInStmt of JavaScript.forInInit * JavaScript.expr * JavaScript.stmt
    | ForStmt of JavaScript.forInit * JavaScript.expr * JavaScript.expr *
        JavaScript.stmt
    | TryStmt of JavaScript.stmt * JavaScript.catch list * JavaScript.stmt
    | ThrowStmt of JavaScript.expr
    | ReturnStmt of JavaScript.expr
    | WithStmt of JavaScript.expr * JavaScript.stmt
    | VarDeclStmt of JavaScript.varDecl list
    | FuncStmt of JavaScript.id * JavaScript.id list * JavaScript.stmt
  type prog = JavaScript_syntax.prog = Prog of JavaScript.stmt list
  val from_string : string -> JavaScript.prog
  val from_file : string -> JavaScript.prog
  val show_expr : JavaScript.expr -> string
  val show_stmt : JavaScript.stmt -> string
  val show_prog : JavaScript.prog -> string
end