type token =
  | SEMI
  | LPAREN
  | RPAREN
  | LBRACK
  | RBRACK
  | LBRACE
  | RBRACE
  | COMMA
  | MAP_PUT
  | MAP_GET
  | MAP_CONTAINS_KEY
  | MAP_CONTAINS_VALUE
  | MAP_REMOVE_NODE
  | MAP_IS_EQUAL
  | GRAPH_EDGES
  | GRAPH_NODES
  | GRAPH_ALL_VERTICES
  | NOT
  | EQ
  | NEQ
  | LT
  | LEQ
  | GT
  | GEQ
  | AND
  | OR
  | UNION
  | INTERSECT
  | MOD
  | PLUS
  | MINUS
  | TIMES
  | DIVIDE
  | ASSIGN
  | ADDASN
  | MINASN
  | TIMASN
  | DIVASN
  | RETURN
  | IF
  | ELSE
  | FOR
  | WHILE
  | INT
  | CHAR
  | BOOL
  | FLOAT
  | STR
  | VOID
  | GRAPH
  | MAP
  | LGRAPH
  | RGRAPH
  | UNIARR
  | DIRARR
  | DELEDGE
  | DELNODE
  | LIST
  | LIST_SIZE
  | LIST_GET
  | LIST_SET
  | LIST_ADD_H
  | LIST_RM_H
  | LIST_ADD_T
  | COLON
  | LMAP
  | RMAP
  | LITERAL of (int)
  | BLIT of (bool)
  | ID of (string)
  | FLIT of (string)
  | CHARLIT of (char)
  | STRLIT of (string)
  | EOF

val program :
  (Lexing.lexbuf  -> token) -> Lexing.lexbuf -> Ast.program
