Интерпретация собственного языка - PullRequest
3 голосов
/ 07 января 2011

Мне нужно разработать приложение, которое будет читать и понимать текстовый файл, в котором я найду собственный язык, описывающий список операций (например, рецепт приготовления). Этот язык еще не определен, но, вероятно, он примет одну из следующих форм:

  • C ++, как код

(Этот код генерируется случайным образом, только для примера):

begin
repeat(10)
{
    bar(toto, 10, 1999, xxx);
}
result = foo(xxxx, 10);
if(foo == ok)
{
    ...
}
else
{
    ...
}
end
  • XML-код

(Этот код генерируется случайным образом, только для примера):

<recipe>
    <action name="foo" argument"bar, toto, xxx" repeat=10/>
    <action name="bar" argument"xxxxx;10" condition="foo == ok">
        <true>...</true>
        <false>...</false>
    </action>
</recipe>

Независимо от того, какой язык будет выбран, придется обрабатывать простые условия, циклы.

Я никогда такого не делал, но на первый взгляд мне приходит в голову, что описание этих операций в XML было бы проще, но менее мощным.

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

Другими словами, что мне нужно, чтобы прочитать текстовый файл, правильно его интерпретировать и выполнить действия в моем коде C #. Эти операции будут взаимодействовать между собой с помощью простых условий, таких как:

  • Если операция 1 завершилась неудачей, я делаю операцию 2, иначе операция 3.
  • Повторите операцию4 10 раз.

Какой язык лучше всего подходит для описания этих текстовых файлов (XML, мой собственный)? Каковы ключевые моменты во время таких разработок?

Надеюсь, я прояснил:)

Большое спасибо за вашу помощь и советы!

Ответы [ 4 ]

3 голосов
/ 07 января 2011

XML отлично подходит для подробного хранения реляционных данных. Однако я думаю, что это ужасный кандидат на написание логики, такой как программа.

Рассматривали ли вы использование существующего языка грамматики / сценариев, который вы можете встроить, вместо того, чтобы писать собственный? Например:

LUA

Python

2 голосов
/ 07 января 2011

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

Это работает оченьприятно решить проблему с разбивкой по текстам / разбору текстовых файлов и вместо этого сосредоточиться на своем «языке» и логике операций на вашем языке.Обратная сторона написания текстовых файлов немного странная и очень многословная.Это также очень неестественно для использования программистом в синтаксисе C / C ++.

В конце концов вы можете легко заменить ваш XML полноценным сканером и лексером, чтобы проанализировать более «естественный» C ++ формат текста в вашем дереве выражений.

Что касается написания сканера и лексера, я обнаружил, что проще написать их вручную, используя простой логический поток / циклы для сканера и рекурсивный приличный синтаксический анализатор для лексера.

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

1 голос
/ 12 января 2011

Лучший готовый ответ: S-выражения

C и XML - хорошие первые шаги. У них есть своего рода противоположные недостатки. C-подобный синтаксис не добавит тонны дополнительных символов, но его будет сложно проанализировать из-за неоднозначности, разнообразия токенов и, возможно, еще множества проблем, о которых я не могу думать. XML относительно легко разобрать, и в нем есть множество примеров кода, но он также будет содержать тонны дополнительного текста. Это также может дать вам слишком много опций для того, где можно придерживаться языковых функций - например, сколько раз повторять цикл для атрибута, элемента или текста?

S-выражения более кратки, чем XML, наверняка, даже C. В то же время они специфичны для задачи применения операций к данным. Они не допускают двусмысленности. Парсеры просты и легко найти пример кода для .

Это может избавить вас от необходимости изучать слишком много теории, прежде чем вы начнете экспериментировать. Я подчеркну точку зрения MerickOWA о том, что ANTLR и другие генераторы парсеров, вероятно, являются более серьезной битвой, чем вы хотите сражаться прямо сейчас. Посмотрите это обсуждение на programmers.stackexchange , чтобы узнать, когда может помочь полная универсальность этого типа инструмента.

1 голос
/ 07 января 2011

Я бы рекомендовал написать приложение на F #.Он имеет много полезных функций для разбора строк и xmls, таких как Pattern Matching и Active Patterns.

Для разбора C-подобного кода я бы порекомендовал F # (только что один интерпретатор с F # работает как шарм)

Для анализа XML я бы порекомендовал класс C # / F # + XmlDocument.

В основном вам нужно работать с двумя файлами:

  • Словарь оператора
  • Файл кода вYourLanguage

Загрузите и интерпретируйте операторы, а затем примените их рекурсивно к вашему файлу кода.

...