Agregar información de línea a mi AST en OCaml

Estoy creando un compilador en OCaml donde la gramática es la siguiente:

type expr =
| Cons of const
| Var of string
| List of ( expr list )
| Sum of ( expr * expr )
| Less_than of ( expr * expr ) 
| Conditional of ( expr * expr * expr )
| Array_literal of ( expr )
| Array_read of ( expr * expr )

El nodo de un AST se ve así:

type 'a astNode = 
{
data: 'a;
metadata: Metadata;
}

y el módulo de metadatos se ve así:

module Metadata = struct
    type loc = Lexing.position
    type loc_range = loc * loc

    and metadata = ?
end

¿Cuál debería ser la gramática de los metadatos? ¿Cómo se vería mi código después de la línea?and metadata = ? Básicamente, ¿cuándo debería actualizar el AST con la información de metadatos? ¿Cómo debo estructurar mi AST para contener la información de metadatos? Los metadatos para mí actualmente significan su posición, como el número de línea, el nombre del archivo, etc. Esto está incluido en el módulo Lexing.position.

Respuestas a la pregunta(1)

Su respuesta a la pregunta