2010-03-13 3 views
6

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

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


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. Я знаю, что это можно сделать, потому что раньше было много Документов по сети, но я не могу найти их сейчас.

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

Thanks

+1

Почему это было проголосовано? – 2010-03-16 14:08:56

ответ

1

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

+1

Вид. Код выше, который я написал, похож на прототип. На самом деле это не C#, это мой собственный язык. Я хотел бы иметь возможность кодировать так, как это было выше, а затем преобразовывать его в Javascript. – 2010-03-13 11:55:27

+1

(Только для предотвращения путаницы) причина, по которой у меня есть C# в качестве тега, просто потому, что я хотел бы создать парсер для этого нового языка в C#.(Если для такого типа вещей нужен синтаксический анализатор.) – 2010-03-13 11:57:41

+0

Почему вы хотите разработать новый язык? Разве это не подходит для ваших нужд? –

5

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

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

+2

Благодарим вас за ответ. Это просто упражнение для меня. Я понимаю, что это довольно кривая обучения, НО это то, что я всегда хотел сделать, и я думаю, что есть много языков, которые удовлетворяют мои потребности, но у меня так много жалоб с другими языками, и я просто хотел бы создайте его самостоятельно, потому что тогда я мог бы добавлять/удалять/изменять функции и т. д. – 2010-03-13 19:16:56

+3

Знаменитые последние слова ;-) –

+0

@BenjaminCox действительно они были. Через несколько недель я сдался. Но я вернусь к этому сейчас, имея гораздо больше опыта. Пожелай мне удачи! –

0

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

Наш DMS Software Reengineering Toolkit - это коммерческое решение для построения полных переводчиков по относительно скромным затратам.

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

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

+0

Эй, Ира, ты не работаешь на них? Разве вы не должны вводить в заблуждение, что вы подключаетесь к своей компании? – kyoryu

+0

Я в значительной степени * am * их. Проверьте мою биографию. Не меняет действительности ответа. –

+3

Я не сомневаюсь в этом, и, честно говоря, ваш продукт выглядит очень интересно для меня - если бы у меня было представление о том, сколько это будет стоить, у меня возникнет соблазн дать ему шанс. С моей точки зрения, зная, что это ваш продукт впереди с ответом, кажется более честным, а также потенциально обнаруживая его после расследования. Независимо от того, предназначено это или нет (и вы были очень внимательны, когда меня спрашивали об этом, поэтому я не обвиняю вас в каких-либо намерениях), это может создать впечатление нечестности. Или, говоря другим способом - честность в этом делает вас более вероятными для получения моих * денег :) – kyoryu

2

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

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

+0

Левая рекурсивность не затрудняет анализ. Анализаторы LR обрабатывают это все время. (Я построил полный анализатор C# 4.0, используя GLR, а не LR [потому что это проще, чем даже LR!], Но ни одно из правил, кроме тех, которые формируют списки, остается рекурсивным. И правила формирования списков довольно легко обрабатываются с каждым генератор парсера, который я когда-либо видел. –

+1

Да, это правда, если вы используете генератор синтаксического анализатора, но это не опция по умолчанию - обычно можно было бы ожидать ручного рекурсивного анализатора спуска. И это как раз тот случай, когда C# такой как синтаксис, не лучший выбор для DSL. Конечно, это очень легко обрабатывать, если вы знаете, что делаете. Нет, если это ваш первый DSL когда-либо. И что касается левых рекурсивных правил: expr = expr. method (...) | expr [index] | expr. field | ... - это злая сторона синтаксиса C++ - ish. Конечно, у вас нет GLR. И спасибо за -1 :) –

+0

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

1

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

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

3

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

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

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

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

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

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

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

+1

Большое спасибо за ваш ответ kyoryu :). Не могли бы вы предложить какие-либо ссылки/ссылки, которые помогут мне начать разбор вручную? – 2010-03-14 11:23:53

0

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

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

Почему вы не просто использовать HTML, JavaScript и CSS (и JQuery, как кто-то выше предложил)

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

Я хочу спасти вас от боли. Забудь это. Это, наверное, БАД ИДЕЯ!

М.

0
  1. Заканчивать Constructing Language Processors for Little Languages. Полагаю, это очень хорошее введение. На самом деле я только что проконсультировался с моей копией 2 дня назад, когда у меня возникли проблемы с моим парсером шаблонов.

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

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

1

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

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

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

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

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

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

+1

Спасибо за ваш ответ amazedsaint! очень признателен ;) – 2010-03-24 01:27:01

0

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

Разборки на самом деле нелегкая задача, поэтому мы берем как минимум семестр. Однако это можно узнать. Я бы рекомендовал начать с книги Терренса Парра по телефону language implementation patterns. Есть много отличных книг о компиляции и разборе, возможно, наиболее любимыми и ненавистными были Dragon Book.

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

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

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