Ошибка типа при оснащении Менгира абстрактным синтаксическим деревом
РЕДАКТИРОВАТЬ:
Мой следующий вопрос все еще остается в силе, но я ценю, что трудно ответить, не просматривая кучу кода. Поэтому, чтобы задать несколько похожий вопрос, есть ли у кого-нибудь примеры использования Менгира для реализации АСТ? Желательно не "игрушечные" проекты, такие как калькулятор, но я буду признателен за любую помощь, которую смогу получить.
Оригинальный вопрос:
Я пытаюсь реализовать абстрактное синтаксическое дерево с помощью 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
,