Извините за задержку с ответом. Я пришел к этому довольно поздно. Благодарю за ваш ответ. Небольшая комбинация вашего первого и второго метода в итоге сработала для меня. Я использовал модуль Locations и модифицировал каждый astnode, чтобы он содержал информацию о местоположении. Таким образом, когда я анализирую свою программу, я присоединяю информацию строки и другую информацию метаданных к генерируемому узлу ast. Это не требует какого-либо внешнего сопоставления, тем самым устраняя еще одну добавленную головную боль.

даю компилятор в OCaml, где грамматика выглядит следующим образом:

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 )

Узел AST выглядит так:

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

и модуль метаданных выглядит так:

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

    and metadata = ?
end

Какой должна быть грамматика для метаданных? Как будет выглядеть мой код после строкиand metadata = ? По сути, когда мне потребуется обновить AST с помощью информации метаданных. Как мне структурировать мой AST, чтобы он содержал метаданные? Метаданные для меня в настоящее время означают его позицию, такую ​​как номер строки, имя файла и т. Д. Это включено в модуль Lexing.position.

Ответы на вопрос(1)

Ваш ответ на вопрос