Adicionando informações de linha ao meu AST no OCaml

Estou criando um compilador no OCaml, onde a gramática é a seguinte:

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 )

O nó de um AST se parece com isso:

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

e o módulo Metadados fica assim:

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

    and metadata = ?
end

Qual deve ser a gramática dos metadados? Como seria meu código após a linhaand metadata = ? Basicamente, quando seria necessário atualizar o AST com as informações de metadados. Como devo estruturar meu AST para conter as informações de metadados? Atualmente, os metadados para mim significam sua posição como número da linha, nome do arquivo etc. Isso está incluído no módulo Lexing.position.

questionAnswers(1)

yourAnswerToTheQuestion