1

Я пытаюсь написать небольшой компилятор для языка, который обрабатывает лямбда-исчисление. Вот неоднозначное определение языка, что я нашел:.Является ли моя грамматика исчисления лямбда однозначной?

E →^v . E | E E | (E) | v 

Символы ^,, (,) и v являются лексемы.^представляет лямбда, а v представляет собой переменную. Выражение вида^v.E является определением функции, где v - формальный параметр функции, а E - его тело. Если f и g - лямбда-выражения, то лямбда-выражение fg представляет собой применение функции f к аргументу g.

Я пытаюсь написать однозначную грамматику для этого языка в предположении, что функциональное приложение оставлено ассоциативным, например, fgh = (fg) h, и эта функция приложения связывается более жестко, чем., Например, (^ x ..^у й)^ZZ = (..^х (^ у й))^ZZ

Вот то, что я до сих пор, но я не уверен, если это правильно:

E -> ^v.E | T 
T -> vF | (E) E 
F -> v | epsilon 

Может ли кто-нибудь помочь?

+1

1) Однозначные грамматики - это не все-и-все-все. –

+0

2) Почему вы делаете это вручную, а не с помощью (бесплатного) инструмента грамматики, из которого многие доступны бесплатно в Интернете? –

+0

Уход, чтобы указать мне на хороший? Я довольно новичок в этом. –

ответ

5

Между тем, прочитав ваш вопрос и комментарии, вы, кажется, больше ищете помощь в изучении и внедрении лямбда-исчисления, а не только конкретный вопрос, который вы задали здесь. Если да, то я нахожусь на одном пути, поэтому я поделюсь некоторой полезной информацией.

Лучшая книга, которую я имею, а это не значит, что самая лучшая книга - Types and Programming Languages (WorldCat) от Benjamin C. Pierce. Я знаю, что название звучит не как лямбда-исчисление, а взгляните на λ-Calculus extensions: meaning of extension symbols, в котором перечислены многие из лямбда-исчислений, которые исходят из книги. Есть код для книги: OCaml и F#.

Попробуйте найти в CiteSeerX для исследований по исчислению лямбда, чтобы узнать больше.

Лучший λ-исчисление оценщик я нашел до сих пор:

Lambda calculus reduction workbench с информацией here.

Кроме того, я нахожу, что вы получите гораздо лучшие ответы на вопросы лямбда-исчисления, связанные с программированием, на CS:StackExchange и связанные с математикой вопросы в Math:StackExcahnge.

Что касается языков программирования для реализации лямбда-исчисления, вам, вероятно, потребуется узнать functional language, если вы этого не сделали; Да, это другой зверь, но просветление на другой стороне горы впечатляет. Большая часть исходного кода, который я нахожу, использует функциональный язык, такой как ML или OCaml, и как только вы его изучаете, остальным становится легче учиться.

Чтобы быть более конкретным, here исходным код для бестипового исчисления проекта лямбды, here является входным файлом на F # варьирование YACC, который от чтения вашего предыдущего questions, кажется, в вашем мире знаний и here является образец ввод.

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

Наконец мы добираемся до части вы после

Примечания LCID является идентификатором нижнего регистра

Term : AppTerm 
    | LAMBDA LCID DOT Term 
    | LAMBDA USCORE DOT Term 

AppTerm : ATerm 
     | AppTerm ATerm 

/* Atomic terms are ones that never require extra parentheses */ 
ATerm : LPAREN Term RPAREN 
     | LCID 
+0

Спасибо за этот ответ. Я немного смущен термином USCORE в грамматике, которую вы предоставили, - это, похоже, не является частью языка, указанного выше. Кроме того, предоставленная вами грамматика кажется леворекурсивной, чего я пытаюсь избежать в настоящий момент. Не могли бы вы прокомментировать законность грамматики, которую я написал? –

+0

@JohnRoberts Мне нужно будет больше изучить USCORE перед ответом, я использую некоторые другие грамматики из проекта. Как отмечает Питер Геркенс, не зацикливайтесь на грамматике. Давным-давно я сделал то же самое, теперь я посвящаю себя AST и использую один из многих парсеров, то есть LL, LR, парсерные комбинаторы, рекурсивный спуск ручного построения и т. Д. Для создания AST. Чтобы определить, является ли ваша грамматика неприемлемой, вам нужно указать тип анализатора. Эта грамматика предназначена для LR-paser, но вы, похоже, после грамматики LL, нет? –

+0

Я ищу грамматику парсера LALR (1) - сначала я проверяю LL (1) как быструю проверку. Во второй раз взглянув на мою грамматику, мне кажется, что она неспособна обрабатывать случай заключенного в скобки выражения в конце строки, например λx.λy.λz.x (y z) - вы тоже это видите? –

2

Вы можете найти доказательство двусмысленности конкретной грамматики в сублинейное время, но доказать, что грамматика однозначно является NP полной проблемой. Вам нужно будет генерировать все возможные предложения на этом языке и проверить, что для каждого из них есть только один вывод.

 Смежные вопросы

  • Нет связанных вопросов^_^