Извините за задержку с ответом. Я пришел к этому довольно поздно. Благодарю за ваш ответ. Небольшая комбинация вашего первого и второго метода в итоге сработала для меня. Я использовал модуль 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.