Создание языка сценариев, который будет использоваться для создания веб-страниц - PullRequest
6 голосов
/ 13 марта 2010

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

У меня есть файл, который выглядит так:

<ч />
mylanguagename(main) {
       OnLoad(protected) {
              Display(img, text, link);
       }

       Canvas(public) {
              Image img: "Images\my_image.png";
                    img.Name: "img";
                    img.Border: "None";
                    img.BackgroundColor: "Transparent";
                    img.Position: 10, 10;

              Text text: "This is a multiline str#ning. The #n creates a new line.";
                   text.Name: text;
                   text.Position: 10, 25;

              Link link: "Click here to enlarge img.";
                   link.Name: "link";
                   link.Position: 10, 60;

                   link.Event: link.Clicked;
       }

       link.Clicked(sender, link, protected) {
              Image img: from Canvas.FindElement(img);
                    img.Size: 300, 300;
       }
}

... и мне нужно, чтобы вышеуказанный текст был нацелен на Windows Scripting Host. Я знаю, что это можно сделать, потому что некоторое время назад в сети было много Документов, но сейчас я не могу их найти.

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

Спасибо

Ответы [ 10 ]

5 голосов
/ 13 марта 2010

Вы создаете предметно-ориентированный язык, который не существует. Вы хотите перевести на другой язык. Вам понадобится правильный сканер и парсер. Вам, вероятно, сказали посмотреть на antlr. яцк / бизон или золото. Что пошло не так с этим?

И как к сведению, это забавное упражнение по созданию новых языков, но перед тем, как сделать что-то подобное, вы можете спросить хорошее твердое «почему? разумный) путь? "

3 голосов
/ 14 марта 2010

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

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

Из потока токенов вы обычно создаете промежуточную структуру, обычно некую древовидную структуру, описывающую написанный код.

Эта древовидная структура может быть проверена или изменена по различным причинам, включая оптимизацию.

Как только это будет сделано, вы, как правило, будете записывать дерево в какую-то другую форму - инструкции по сборке или даже в программу на другом языке - фактически, самые ранние версии C ++ записывали прямой код C, который затем компилировался обычный компилятор C, который вообще не знал C ++. Поэтому, хотя пропустить этап создания сборки может показаться обманом, у него есть давняя и гордая традиция:)

Я сознательно не получил никаких предложений по конкретным библиотекам, поскольку понимание общего процесса, вероятно, гораздо важнее, чем, например, выбор конкретной технологии синтаксического анализатора. Используете ли вы lex / yacc, ANTLR или что-то еще, в долгосрочной перспективе довольно неважно. Все они (в основном) будут работать, и все они будут успешно использоваться в различных проектах.

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

2 голосов
/ 14 марта 2010

Языки, подобные C #, не так просто проанализировать - есть некоторые естественно-рекурсивные правила. Таким образом, вы должны использовать генератор парсера, который может справиться с ними правильно. ANTLR хорошо вписывается.

Если PEG подходит лучше, попробуйте это: http://www.meta -alternative.net / mbase.html

1 голос
/ 23 марта 2010

Предполагая, что вы действительно преданы этому, вот путь. Обычно это то, что вы должны сделать: источник -> SCANNER -> токены -> PARSER -> дерево синтаксиса

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

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

http://www.codeproject.com/KB/recipes/Irony.aspx

2) Создание синтаксического дерева. В этом случае я предлагаю вам создать простое XML-представление вместо фактического синтаксического дерева, чтобы позже вы могли обойти XML-представление вашей DOM, чтобы выплюнуть VB / Java Script. Если ваши требования сложны (например, вы хотите скомпилировать их или около того), вы можете создать дерево выражений DLR или использовать DOM кода - но здесь, я думаю, речь идет о трансляторе, а не о компиляторе.

Но, подождите, если это не для образовательных целей, подумайте о том, чтобы представить свой «скрипт» в виде xml с самого начала, чтобы вы могли избежать сканера / парсера между ними, прежде чем выплевывать какой-либо VB / Java-скрипт / Html из этого.

1 голос
/ 14 марта 2010

Вместо того, чтобы писать на своем собственном языке, а затем запустить переводчик, чтобы преобразовать его в Javascript, почему бы не расширить Javascript, чтобы делать то, что вы хотите?

Взгляните на jQuery - он расширяет Javascript многими мощными способами с очень естественным и свободным синтаксисом. Это почти так же хорошо, как иметь свой собственный язык. Взгляните на множество расширений, которые люди для него создали, особенно на jQuery UI.

1 голос
/ 13 марта 2010

То есть вы хотите перевести программы на C # на JavaScript? Script # может сделать это за вас.

0 голосов
/ 05 апреля 2012

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

Синтаксический анализ не является действительно легкой задачей, поэтому мы берем его, по крайней мере, на один семестр. Однако этому можно научиться. Я бы рекомендовал начать с книги Терренса Парра о шаблонах языковой реализации . Есть много замечательных книг о компиляции и разборе, вероятно, самой любимой и ненавистной была книга Дракона 1006 *.

Это довольно тяжелые вещи, но если вы действительно в этом заинтересованы и у вас есть время, вам обязательно стоит взглянуть. Это будет Робиссон Крузо: «Я сделаю все сам». Недавно я написал генератор синтаксического анализатора LR, и мне потребовались не более долгих выходных, но после того, как я много читал и проходил полный двухсеместровый курс по компиляторам.

Если у вас нет времени или вы просто не хотите учиться делать парсер «как это делают мужчины», тогда вы всегда можете попробовать коммерческий или академический генератор парсера. ANTLR просто отлично, но вы должны изучить его метаязык. Лично я считаю, что Irony - отличный инструмент, особенно потому, что он остается внутри C #, и вы можете взглянуть на исходный код и изучить сами. Поскольку мы здесь, и я вообще не пытаюсь делать какую-либо рекламу, я разместил в CodePlex небольшой инструмент, который может быть полезен для этой задачи. посмотрите для себя, это с открытым исходным кодом и бесплатно.

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

0 голосов
/ 23 марта 2010
  1. Проверьте Создание языковых процессоров для небольших языков . Я считаю, что это очень хорошее вступление. На самом деле я только что обратился к своей копии 2 дня назад, когда у меня возникли проблемы с парсером языка шаблонов.

  2. Используйте XML, если это вообще возможно. Вы не хотите возиться с лексером и парсером вручную, если хотите, чтобы эта штука была в производстве. Я сделал эту ошибку несколько раз. В итоге вы поддерживаете код, которым на самом деле не должен быть. Кажется, что ваш язык в основном шаблонный язык. XML отлично сработает. Так же, как файлы ASPX являются XML. Ваши серверные блоки могут быть написаны на Javascript, изменены при необходимости. Если это учебное упражнение, делайте все вручную, всеми средствами.

Я думаю, что писать на своем родном языке - отличное упражнение. То же самое относится и к написанию уроков по компиляции на уровне колледжа. Удачи.

0 голосов
/ 23 марта 2010

Я не хочу быть грубым ... но зачем ты это делаешь?

Создание парсера для обычного языка - нетривиальная задача. Просто не делай этого.

Почему бы вам просто не использовать html, javascript и css (и jquery, как предлагалось выше)

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

Я хочу избавить тебя от боли. Забудь это. Это, вероятно, плохая идея!

М.

0 голосов
/ 14 марта 2010

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

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

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

Последнее замечание: создать полный язык сложно, если вы хотите получить хороший результат.

...