Server Script это режим когда script вклеен в текст например в HTML конструкциями типа
text <% script %> text. Такой скрипт работает в процессе формирования страницы.
В режиме Client Script в HTMLayout позволяет обрабатывать события DOM элементов
включая события от стандартных HWND controls.
3) Поддерживается interactive mode (-i switch).
4) Работает на всех платформах поддерживаемых HTMLayout ( сейчас это Windows 32/64 и Windows Mobile )
5) Компилируемый ( -c switch ) — исходник компилируется в bytecode и можно этот bytecode сохранить в файл (.jsb) и запустить в последствии.
Примеры в tiscript_demo.zip:
enumgen.jsp
— генератор "smart enum" для С++ — по дефиниции enum строит структуру с методами to_string и from_string. Server Script mode sample.
try.js
— try/catch/finally exception handling.
re.js
— regular expressions demo.
Здравствуйте, c-smile, Вы писали:
CS>Захотелось мне вот чтобы было нечто позволяющее по струкутре вида: CS>... CS>Подходов к автоматической генерации source code много.
CS>Философически подумалось мне что подход в стиле формирования PHP pages или ASP для этого тоже будет полезным и удобным.
CS>Написал вариацию ECMAScript и оформил ея в виде command line utility — эдакий local server pages engine.
Здесь есть две подзадачи:
1. Что описывать. Это исходные данные для генерации.
2. Чем генерировать. Тут от первой подзадачи жесткой зависимости нет.
У меня есть проект TreeDL, который позволяет описывать структуру деревьев
(изначально — abstract syntax tree) с типизированными узлами,
и определять операции над ними. Помимо языка описания есть инструмент,
который генерирует набор классов, соответствующих узлам, всяческие визитеры,
обходчики дерева и т.п. Конечно, есть возможность дописывать свои модули генерации,
в зависимости от потребностей. Сам инструмент исторически использует собственную библиотеку
кодогенерации (и пользователи отказываются переходить на что-то другое — почти все потребности
удовлетворены), но можно пользоваться любую template engine, которая умеет работать
с java beans — дерево входного текста само описано на TreDL, интерфейс хорошо описан и открыт
для плагинов.
Генератор сейчас есть для Java, в предыдущей версии был и для C#, дойдут руки — обновлю и его.
Инструмент использовался и используется в наших проектах по созданию спецификационных
расширений языка программирования (http://www.unitesk.com), достаточно стабилен, развивается.
Ну и конечно это open source (http://treedl.sf.net). Помимо самого инструмента
открыт, например, Java 5 frontend — парсер, который строит TreeDL дерево
и принтер, который обратно Java печатает.
Так что если надо для Java какую-то кодогенерацию сделать, или препроцессор умный
(например, пару statements добавить, которые можно в Java странслировать) —
большая часть работы уже сделана
Будет и semantic analyzer для этого дерева.
C# frontend в планах, но руки не доходят — парсер и дерево написаны, но надо адаптировать.
Ежели кому-то интересно адаптировать — могу выложить сырые версии.
adontz wrote: > Имею аналогичные идеи, только у меня не JavaScript, а C#. Если > одинаковая идея пришла двум разным людям, значит она полезная либо мы > курили одну траву
Пишу так же на Паскаль. Правда скрипты на Паскаль же. Лень (пока) делать
интерпретатор. Идея явно полезная.
Здравствуйте, c-smile, Вы писали:
CS>Примеры в tiscript_demo.zip: CS>enumgen.jsp CS>- генератор "smart enum" для С++ — по дефиниции enum строит структуру с методами to_string и from_string. Server Script mode sample. CS>try.js CS>- try/catch/finally exception handling. CS>re.js CS>- regular expressions demo.
Здравствуйте, all-x, Вы писали:
AX>Здравствуйте, c-smile, Вы писали:
CS>>Захотелось мне вот чтобы было нечто позволяющее по струкутре вида: CS>>... CS>>Подходов к автоматической генерации source code много.
CS>>Философически подумалось мне что подход в стиле формирования PHP pages или ASP для этого тоже будет полезным и удобным. CS>>Написал вариацию ECMAScript и оформил ея в виде command line utility — эдакий local server pages engine.
AX>Здесь есть две подзадачи: AX>1. Что описывать. Это исходные данные для генерации. AX>2. Чем генерировать. Тут от первой подзадачи жесткой зависимости нет.
...красота поскипана...
собственно моя идея про "Чем генерировать" как раз и заключается в
том что в качестве такого генератора выступает проверенный метод Server Pages.
Как один из подходов.
Технология то уже изъеденная. И каждый приличный боец нынче знаком с PHP, Perl, JavaScript со товарищи.
Как кстати такой метод генерации текста называется по науке?
Здравствуйте, raskin, Вы писали:
R>adontz wrote: >> Имею аналогичные идеи, только у меня не JavaScript, а C#. Если >> одинаковая идея пришла двум разным людям, значит она полезная либо мы >> курили одну траву
R>Пишу так же на Паскаль. Правда скрипты на Паскаль же. Лень (пока) делать R>интерпретатор. Идея явно полезная.
Ну дык какой-нибудь LUA приделать для этого и гори оно огнем...
c-smile wrote: >> > Имею аналогичные идеи, только у меня не JavaScript, а C#. Если >> > одинаковая идея пришла двум разным людям, значит она полезная либо мы >> > курили одну траву > > R>Пишу так же на Паскаль. Правда скрипты на Паскаль же. Лень (пока) делать > R>интерпретатор. Идея явно полезная. > > Ну дык какой-нибудь LUA приделать для этого и гори оно огнем...
Да ну его.. Если скрипты маленькие — оно и на компиляторе не тормозит. А
когда соберусь доделывать — то и интерпретатор Паскаль найду/напишу.
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Подозреваю, что речь шла об использовании C# в качестве скриптового языка ("у меня не JavaScript, а C#") для препроцессирования C++.
Здравствуйте, IT, Вы писали:
IT>Вам, Рома, я могу только посоветовать учить мат. часть. IT>
IT>enum _
IT>{
IT> one = 1,
IT> two = 2,
IT> three = 3
IT>}
IT>static void Main()
IT>{
IT> Console.WriteLine(_.two.ToString());
IT> Console.WriteLine(Enum.Parse(typeof(_), "two"));
IT>}
IT>
Ну для примитивных задачек встроенные средства .Net действительно подходят. Только вот задачки в жизни бывают не только примитивные и встроенные средства быстро заканчиваются. Ну да ты наверное таких пока не решал
struct test
{
enum _
{
one = 1,
two = 2,
three = 3
};
static const char * to_string( n )
{
switch( n )
{
case 1: return"one";
case 2: return"two";
case 3: return"three";
default: return 0;
}
}
static int from_string( const char * str )
{
if( 0 == stricmp( str, "one" ) return 1;
if( 0 == stricmp( str, "two" ) return 2;
if( 0 == stricmp( str, "three" ) return 3;
return 0;
}
};
CS>Подходов к автоматической генерации source code много.
Это точно.
CS>Философически подумалось мне что подход в стиле формирования PHP pages или ASP для этого тоже будет полезным и удобным.
А мне Ruby
CS>Написал вариацию ECMAScript и оформил ея в виде command line utility — эдакий local server pages engine.
Я на Ruby (файл enumdef.rb):
module Enumdef_Impl
class Enum_Params
def initialize
@name = nil
@members = []
end
def name( a_name )
@name = a_name
end
def members( a_members )
@members = a_members
end
def generate_name
@name
end
def generate_enum_def
@members.collect { |m|
"#{m[ :name ]} = #{m[ :value ]}"
}.join( ",\n\t\t" )
end
def generate_to_string_cases
@members.collect { |m|
"case #{m[ :value ]}: return \"#{m[ :name ]}\""
}.join( ";\n\t\t\t" )
end
def generate_from_string_cases
@members.collect { |m|
"if( 0 == stricmp( str, \"#{m[ :name ]}\" ) return #{m[ :value ]}"
}.join( ";\n\t\t" )
end
end
end # module Enumdef_Impl
def enumdef( &cmd )
e = Enumdef_Impl::Enum_Params.new
e.instance_eval( &cmd )
puts <<VERBATIM
struct #{e.generate_name}
{
enum _
{
#{e.generate_enum_def}
};
static const char * to_string( n )
{
switch( n )
{
#{e.generate_to_string_cases};
default: return 0;
}
}
static int from_string( const char * str )
{
#{e.generate_from_string_cases};
return 0;
}
};
VERBATIM
end
CS>Вот и все собственно...
Аналогично...
Небольшой комментарий. Если запускать "ryby -renumdef <some-file.rb>", то можно обойтись без первой директивы require. Тогда получится чистая декларативность: