Как бы вы написать в любой из следующих генераторов Parser в Parsing Expression Grammar (PEG.js, Citrus, Treetop), который может работать с Python/Haskell/CoffeScript стиль отступов:PEG для Python стиль отступов
примеры не находиться еще существующий язык программирования:
square x =
x * x
cube x =
x * square x
fib n =
if n <= 1
0
else
fib(n - 2) + fib(n - 1) # some cheating allowed here with brackets
Обновление: Не пытайтесь написать интерпретатор для приведенных выше примеров. Меня интересует проблема с отступом. Другим примером может быть синтаксический анализ:
foo
bar = 1
baz = 2
tap
zap = 3
# should yield (ruby style hashmap):
# {:foo => { :bar => 1, :baz => 2}, :tap => { :zap => 3 } }
Я не знаком с Цитрусом и Тритопом, но хотя PEG.js является аккуратным инструментом, он слишком мало подходит для такого рода интерпретации, ИМО. Кроме того, я не думаю, что кто-то опубликует (справедливо) простой файл грамматики (с встроенными действиями), способный интерпретировать такой язык, который вы описываете, поскольку в нем есть довольно много кода, помимо определения грамматики: переход по AST, сохранение данных в различные области действия, разрешая переменные в области видимости и, возможно, даже всплывающие области, если в нем не обнаружена определенная переменная. –
P.S. вы задаете свой вопрос так, как будто у вас есть ответ. Это реальный вопрос или еще одна загадка? Если это реальный вопрос, я рекомендую вам дать [Шаблоны реализации языка: создать свой собственный доменный и общий язык программирования] (http://www.pragprog.com/titles/tpdsl/language-implementation-patterns): он также объясняет, как можно интерпретировать язык, такой как Python (по крайней мере, это «чувствительная к отступу» часть). –
Привет, Барт, спасибо за ссылку на книгу. К сожалению, у меня нет ответа. Я знаю, что создание интерпретатора для языка, приведенного в приведенных выше примерах, не является тривиальным, но это не то, что я ожидаю здесь. Меня интересует только часть того, как обрабатывать часть отступов/проблему синтаксического анализа. Я на самом деле могу написать рукописный парсер, который отслеживает уровни отступов, но я как-то терпит неудачу, чтобы наметить концепцию для PEG. Любая помощь приветствуется. Matt – Matt