`type id =`

1. `| Ident of string`
2. `| Number of string`
3. `| String of string`
4. `| Html of string`

`type attr = (id * id option) list`
`type compass_pt =`

1. `| N`
2. `| Ne`
3. `| E`
4. `| Se`
5. `| S`
6. `| Sw`
7. `| W`
8. `| Nw`

`type port =`

1. `| PortId of id * compass_pt option`
2. `| PortC of compass_pt`

`type node_id = id * port option`
`type subgraph =`

1. `| SubgraphId of id`
2. `| SubgraphDef of id option * stmt list`

`and node =`

1. `| NodeId of node_id`
2. `| NodeSub of subgraph`

`and stmt =`

1. `| Node_stmt of node_id * attr list`
2. `| Edge_stmt of node * node list * attr list`
3. `| Attr_graph of attr list`
4. `| Attr_node of attr list`
5. `| Attr_edge of attr list`
6. `| Equal of id * id`
7. `| Subgraph of subgraph`

`type file = {`

1. `strict : bool;`
2. `digraph : bool;`
3. `id : id option;`
4. `stmts : stmt list;`

`}`