Ошибка типа при оснащении Менгира абстрактным синтаксическим деревом

РЕДАКТИРОВАТЬ:

Мой следующий вопрос все еще остается в силе, но я ценю, что трудно ответить, не просматривая кучу кода. Поэтому, чтобы задать несколько похожий вопрос, есть ли у кого-нибудь примеры использования Менгира для реализации АСТ? Желательно не "игрушечные" проекты, такие как калькулятор, но я буду признателен за любую помощь, которую смогу получить.

Оригинальный вопрос:

Я пытаюсь реализовать абстрактное синтаксическое дерево с помощью Menhir, и есть проблема, которую я не могу решить. Моя установка выглядит следующим образом:

  • Спецификация AST генерируется с использованием atdgen. Это в основном файл со всеми моими правилами грамматики, переведенными в формат ATD. Это позволяет мне сериализовать некоторый JSON, который я использую для распечатки AST.
  • В моем файле parser.mly у меня есть длинный список продукции. Поскольку я использую Menhir, я могу связать эти произведения с созданием узла AST, то есть каждому произведению из парсера соответствует инструкция для записи значения в AST.

Во-вторых, я действительно изо всех сил стараюсь добиться прогресса. У меня огромная грамматика (файл ast.atd имеет длину ~600 строк, а файл parser.mly имеет длину ~1000 файлов), поэтому трудно определить, где я ошибаюсь. Я подозреваю, что у меня есть ошибка типа где-то по пути.

Фрагменты кода

Вот как выглядит мой файл ast.atd:

    ...
type star = [ Star ]

type equal = [ Equal ]

type augassign = [
  | Plusequal
  | Minequal
  | Starequal
  | Slashequal
  | Percentequal
  | Amperequal
  | Vbarequal
  | Circumflexequal
  | Leftshiftequal
  | Rightshiftequal
  | Doublestarequal
  | Doubleslashequal
]
    ...

Вот как выглядит мой файл parser.mly:

    ...
and_expr // Used in: xor_expr, and_expr
    : shift_expr
        { $1 }
    | and_expr AMPERSAND shift_expr
        { `And_shift ($1, `Ampersand, $3) } ;

shift_expr // Used in: and_expr, shift_expr
    : arith_expr
        { $1 }
    | shift_expr pick_LEFTSHIFT_RIGHTSHIFT arith_expr
        { `Shift_pick_arith ($1, $2, $3) } ;

pick_LEFTSHIFT_RIGHTSHIFT // Used in: shift_expr
    : LEFTSHIFT
        { `Leftshift }
    | RIGHTSHIFT
        { `Rightshift } ;
    ...

Ошибка, которую я получаю, когда пытаюсь скомпилировать файлы с

ocamlbuild -use-menhir -tag thread -use-ocamlfind -quiet -pkgs
    'core,yojson,atdgen' main.native

это ошибка типа, т.е.

This expression has type [GIANT TYPE CONSTRUCTION] but an expression
    was expected of type [DIFFERENT GIANT TYPE CONSTRUCTION]

Я понимаю, что на этот вопрос довольно сложно ответить в абстрактном виде, как это, и я рад предоставить ссылку на выпадающий список моего кода, но я был бы очень признателен, если бы кто-то мог указать мне правильное направление.

Возможно, интерес: у меня есть несколько продуктов в parser.mly, которые изначально были "пустыми", с которыми я имел дело с помощью ocaml option тип (Some а также None). Возможно, у меня могут быть проблемы здесь?

1 ответ

Решение

О примерах использования кода menhirВы можете взглянуть на список справа на странице менгира OPAM - все зависит от menhir,

Другие вопросы по тегам