Отслеживание исходного положения узлов AST в компиляторе (ocaml) - PullRequest
4 голосов
/ 19 января 2012

Я пишу компилятор в ocaml, используя ocamllex / yacc. Все идет хорошо, но у меня проблема с дизайном. Для каждого создаваемого мной узла AST было бы хорошо иметь информацию о позиции строки / символа этого узла в исходном коде. Это было бы полезно для предоставления сообщений об ошибках пользователю позже.

Теперь я могу добавить некоторый мета-тип в мои узлы:

type node = Node1 of ... * meta | Node2 of ... * meta

но это кажется излишним. Позже, когда я закончу проверку AST, мне нужно будет написать

match n with 
| NodeX(..., _) -> ...

в каждом match, который является пустой тратой пространства.

Какой лучший способ решить эту проблему?

1 Ответ

5 голосов
/ 19 января 2012

Обычный способ решить эту проблему - использовать запись для хранения метаинформации и выражения узла:

type node_exp = Node1 of ... | Node2 of ...
and node = { exp: node_exp; meta: meta }

и затем:

match n.exp with
  | NodeX ... -> ...
...