Описание тега menhir

Menhir - генератор парсеров для OCaml
1 ответ

Менгир - правила ассоциативности для сокращения последовательностей выражений

Написание парсера для лямбда-выражений, data expr = Symbol of string | Lambda of string * expr | App of expr * expr При написании .mly файл, как я могу выразить идею, что последовательность выражений e1 e2 e3 e4 должен быть разобран как App ((App (A…
17 дек '16 в 23:19
1 ответ

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

РЕДАКТИРОВАТЬ: Мой следующий вопрос все еще остается в силе, но я ценю, что трудно ответить, не просматривая кучу кода. Поэтому, чтобы задать несколько похожий вопрос, есть ли у кого-нибудь примеры использования Менгира для реализации АСТ? Желательн…
20 мар '17 в 15:57
1 ответ

ParserErr генерирует "исключение индекса вне границ"

Я создаю компилятор и пытаюсь извлечь информацию о строке из парсера. Я хочу присоединить это к узлу AST в качестве метаданных, чтобы можно было легко сообщать о любой ошибке на более позднем этапе. Я успешно смог извлечь информацию о линии в Lexer …
08 май '18 в 07:35
1 ответ

Расширить ocamllex для большей лексики

Есть ли способ заставить ocammlex работать с большим количеством ключевых слов? Я написал интерпретатор и парсер для немецкого языка, который "компилирует" немецкий текст в латексные картинки для анализа языка. это работает очень хорошо и действител…
15 июл '14 в 13:10
2 ответа

Конфликт при разборе набора выражений

Я хотел бы разобрать набор выражений: R[3]C, R[2]C, R[3]C-R[2]C... Есть конфликт, который я не могу решить... Вот часть lexer.mll: rule token = parse | 'R' { R } | 'C' { C } | "RC" { RC } | ['0'-'9']+ as lxm { INTEGER (int_of_string lxm) } | '+' { P…
1 ответ

Перегрузка умножения с использованием менгира и OCaml

Я написал лексер и парсер для анализа операторов линейной алгебры. Каждое утверждение состоит из одного или нескольких выражений, за которыми следует одно или несколько объявлений. Я использую menhir и OCaml для написания лексера и парсера. Например…
20 апр '14 в 15:06
1 ответ

Как разобрать список выражений с помощью менгира?

Вот мой текущий лексер и парсер для языка тигра Эндрю Аппеля (ocaml). В настоящее время я пытаюсь поддерживать взаимные рекурсивные функции, но следующий код парсера не работает: decs : | l = list(dec) { l } dec : | t = nonempty_list(loc(tydec)) { S…
21 ноя '17 в 10:27
2 ответа

menhir - связывает узлы AST с местоположениями токенов в исходном файле

Я использую Menhir для разбора DSL. Мой парсер строит AST, используя сложную коллекцию вложенных типов. Во время более поздней проверки типов и других проходов в отчетах об ошибках, сгенерированных для пользователя, я хотел бы сослаться на позицию и…
1 ответ

Сдвиг / уменьшение конфликта с вложенными списками

Я работал над "Современной реализацией компилятора в ML", преобразовывая SML в OCaml, когда я иду. Книга определяет язык под названием Тигр, который имеет let ... in ... end синтаксис для объявления типов, переменных и функций в области видимости дл…
11 авг '17 в 16:13
1 ответ

Заставьте менгира добавлять пользовательские функции из.mly в.mli

Менгир позволяет добавить произвольный код ocaml в конец файла.mly, где я хочу объявить несколько функций. Но я не смог найти способ заставить менгира добавить свои функции в файл.mli, чтобы они были видны из других модулей. Является ли это возможны…
09 ноя '16 в 19:13
0 ответов

Ошибка: генерирует пустой язык, используя Menhir и OCaml

В настоящее время я работаю над Pascal Parser, используя OCaml и Menhir. Когда я компилирую свой parser.mly, который содержит следующий скриптлет, Менгир просто говорит: "Предупреждение: if_cmd генерирует пустой язык". Это может произойти, когда пра…
05 май '16 в 18:12
1 ответ

Заставить менгира найти все альтернативы?

Я хотел бы изменить поведение вывода менгира следующим образом: я хочу, чтобы он посмотрел все грамматические альтернативы, если он найдет их, и поместил их в список и вернул мне эту неоднозначную интерпретацию. Это не должно уменьшать конфликты, пр…
09 июн '16 в 10:30
1 ответ

Передавать значения в качестве аргументов в правила

При реализации языков реального мира (TM) я часто сталкиваюсь с такой ситуацией: (* language Foo *) type A = ... (* parsed by parse_A *) type B = ... (* parsed by parse_B *) type collection = { as : A list ; bs : B list } (* parser ParseFoo.mly *) p…
05 янв '15 в 09:21
2 ответа

На первый взгляд эквивалентные правила Менгира изменяют сдвиг / уменьшают конфликты, встречающиеся в грамматике

Я использую Menhir для создания парсера, и меня всегда смущает такое поведение, и я этого не понимаю. Я создал следующий минимальный пример, чтобы продемонстрировать это; здесь показано объявление аргумента получателя в объявлении метода на языке Go…
1 ответ

Menhir разделенный_nonempty_list генерирует код с ошибкой типа

У меня есть простое рекурсивное правило: i_stmt: | CHAIN LPAREN c=separated_nonempty_list(i_stmt, COMMA) RPAREN {Chain c} | ASSIGN LPAREN n=i_var COMMA e=i_expr RPAREN {Assign (n,e)} | CRETURN LPAREN i=i_expr RPAREN { Return i } ; Он скомпилирован н…
19 май '17 в 01:29
1 ответ

В Менгире возможно ли сделать правило левоассоциативным, если у него нет оператора?

Я пытаюсь использовать Menhir для написания парсера для языка регулярных выражений. Моя желаемая грамматика, прежде чем я изменю ее, чтобы устранить неоднозначности, выглядит немного как следующий пример. Обратите внимание, что "последовательность /…
29 мар '16 в 15:03
1 ответ

Доллар + идентификатор в мли

Я вижу $startpos а также $endpos в .mly типа проверки: recursive_def: | f = term_variable ty_args = multiple(formal_type_arguments) te_args = multiple(term_arguments) codomain = preceded(COLON,typ) EQ t = loc(term) { let loc = ($startpos(ty_args), $…
02 июн '16 в 15:11
1 ответ

Отладка парсера путем вывода полезной информации

Я хотел бы проанализировать набор выражений, например:X[3], X[-3], XY[-2], X[4]Y[2], так далее. В моем parser.mly, index (который находится внутри []) определяется следующим образом: index: | INTEGER { $1 } | MINUS INTEGER { 0 - $2 } Знак INTEGER, M…
1 ответ

ocaml Менгир парсер производство никогда не уменьшается

Я учусь разбирать простые программы. Это мой лексер. { open Parser exception SyntaxError of string } let white = [' ' '\t']+ let blank = ' ' let identifier = ['a'-'z'] rule token = parse | white {token lexbuf} (* skip whitespace *) | '-' { HYPHEN } …
29 сен '17 в 08:47
1 ответ

Разделение списка по eol при разборе ocaml

Я определил несколько операторов, за которыми следует список выражений в моем компиляторе. Я использую Менгир для разбора. Как правило, когда лексинг EOL это делает это:| eol { incr_linenum lexbuf; read lexbuf }Тем не менее, я хотел бы иметь возможн…
20 май '18 в 23:49