Вот такой вот препроцессор.
От: c-smile Канада http://terrainformatica.com
Дата: 19.08.05 21:32
Оценка: 23 (3) +1
Захотелось мне вот чтобы было нечто позволяющее по струкутре вида:

var enumdef = 
{
  name:"test",
  members: 
  [
    { value: 1, name:"one" },
    { value: 2, name:"two" },
    { value: 3, name:"three"}
  ]
}


генерировать нечто типа (в С++)


struct test 
{
  enum _ 
  {
    one = 1, 
    two = 2, 
    three = 3, 
  };

  static const char* to_string( int 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( stricmp("one",str ) == 0 ) return 1;
      if( stricmp("two",str ) == 0 ) return 2;
      if( stricmp("three",str ) == 0 ) return 3;
      return 0;
  }

};


Подходов к автоматической генерации source code много.

Философически подумалось мне что подход в стиле формирования PHP pages или ASP для этого тоже будет полезным и удобным.

Написал вариацию ECMAScript и оформил ея в виде command line utility — эдакий local server pages engine.

Вот исходник скрипта формирующего enum для меня


<%
var enumdef = 
{
  name:"test",
  members: 
  [
    { value: 1, name:"one" },
    { value: 2, name:"two" },
    { value: 3, name:"three"}
  ]
}
%>

<%
function enumgen( enumdef ) 
{
%>
// enum <% =enumdef.name %>
struct <% =enumdef.name %> 
{
  enum _ 
  {
<% for( var i in enumdef.members )  { var item = enumdef.members[i]; %>
    <% =item.name%> = <% =item.value%>, 
<%}%>
  };
  
  static const char* to_string( int n )
  {
    switch( n )
    {
<% for( var i in enumdef.members ) { var item = enumdef.members[i]; %>
      case <% =item.value%>: return "<% =item.value%>";
<%}%>
      default: return 0;
    }
  }
  
  static int from_string( const char* str )
  {
<% for( var i in enumdef.members ) { var item = enumdef.members[i]; %>
      if( stricmp("<% =item.name%>",str ) == 0 ) return <% =item.value%>;
<%}%>
      return 0;
  }
};
<%
} // end of enumgen

enumgen( enumdef );

%>


Вот и все собственно...

----------------------------
Общая информация:

Основные "фичи":

1) Практически полная имплементация стандарта http://www.mozilla.org/js/language/E262.pdf, (во всяком случае асимптотически приближающаяся к оному.

2) Поддержка Client Script и Server Script:

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.

tiscript это упрощенная версия моего c-smile.
Re: Вот такой вот препроцессор.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 19.08.05 21:43
Оценка: :)
Здравствуйте, c-smile, Вы писали:

Имею аналогичные идеи, только у меня не JavaScript, а C#. Если одинаковая идея пришла двум разным людям, значит она полезная либо мы курили одну траву
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Вот такой вот препроцессор.
От: IT Россия linq2db.com
Дата: 20.08.05 00:56
Оценка: :))
Здравствуйте, c-smile, Вы писали:

CS>Захотелось мне вот чтобы было нечто позволяющее по струкутре вида:


Пора переходить на C#.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Вот такой вот препроцессор.
От: IT Россия linq2db.com
Дата: 20.08.05 01:06
Оценка:
Здравствуйте, adontz, Вы писали:

A>Имею аналогичные идеи, только у меня не JavaScript, а C#.


Вам, Рома, я могу только посоветовать учить мат. часть.

enum _
{
    one = 1,
    two = 2,
    three = 3
}

static void Main()
{
    Console.WriteLine(_.two.ToString());
    Console.WriteLine(Enum.Parse(typeof(_), "two"));
}
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Вот такой вот препроцессор.
От: Павел Кузнецов  
Дата: 20.08.05 01:14
Оценка: +1
IT,

> A>Имею аналогичные идеи, только у меня не JavaScript, а C#.


> Вам, Рома, я могу только посоветовать учить мат. часть.

>
> <...>
>


Подозреваю, что речь шла об использовании C# в качестве скриптового языка ("у меня не JavaScript, а C#") для препроцессирования C++.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Вот такой вот препроцессор.
От: all-x Россия http://treedl.sf.net
Дата: 20.08.05 05:42
Оценка: 3 (2)
Здравствуйте, 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 в планах, но руки не доходят — парсер и дерево написаны, но надо адаптировать.
Ежели кому-то интересно адаптировать — могу выложить сырые версии.
Re[2]: Вот такой вот препроцессор.
От: raskin Россия  
Дата: 20.08.05 05:48
Оценка:
adontz wrote:
> Имею аналогичные идеи, только у меня не JavaScript, а C#. Если
> одинаковая идея пришла двум разным людям, значит она полезная либо мы
> курили одну траву

Пишу так же на Паскаль. Правда скрипты на Паскаль же. Лень (пока) делать
интерпретатор. Идея явно полезная.
Posted via RSDN NNTP Server 2.0 beta
Re: Извиняюсь, забыл ссылку
От: c-smile Канада http://terrainformatica.com
Дата: 20.08.05 06:40
Оценка:
Здравствуйте, 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.

http://terrainformatica.com/tiscript/tiscript_demo.zip
Re[2]: Вот такой вот препроцессор.
От: c-smile Канада http://terrainformatica.com
Дата: 20.08.05 06:43
Оценка:
Здравствуйте, IT, Вы писали:

CS>>Захотелось мне вот чтобы было нечто позволяющее по струкутре вида:


IT>Пора переходить на C#.


Мне не только enum генерировать надо в проектах. HTML собственно тоже надо.
Просто ASP/PHP как локальный engine оказался вельми здравой идеей.
Re[2]: Вот такой вот препроцессор.
От: c-smile Канада http://terrainformatica.com
Дата: 20.08.05 06:51
Оценка:
Здравствуйте, 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 со товарищи.

Как кстати такой метод генерации текста называется по науке?
Re[3]: Вот такой вот препроцессор.
От: c-smile Канада http://terrainformatica.com
Дата: 20.08.05 06:54
Оценка:
Здравствуйте, raskin, Вы писали:

R>adontz wrote:

>> Имею аналогичные идеи, только у меня не JavaScript, а C#. Если
>> одинаковая идея пришла двум разным людям, значит она полезная либо мы
>> курили одну траву

R>Пишу так же на Паскаль. Правда скрипты на Паскаль же. Лень (пока) делать

R>интерпретатор. Идея явно полезная.

Ну дык какой-нибудь LUA приделать для этого и гори оно огнем...
Re[4]: Вот такой вот препроцессор.
От: raskin Россия  
Дата: 20.08.05 06:58
Оценка:
c-smile wrote:
>> > Имею аналогичные идеи, только у меня не JavaScript, а C#. Если
>> > одинаковая идея пришла двум разным людям, значит она полезная либо мы
>> > курили одну траву
>
> R>Пишу так же на Паскаль. Правда скрипты на Паскаль же. Лень (пока) делать
> R>интерпретатор. Идея явно полезная.
>
> Ну дык какой-нибудь LUA приделать для этого и гори оно огнем...

Да ну его.. Если скрипты маленькие — оно и на компиляторе не тормозит. А
когда соберусь доделывать — то и интерпретатор Паскаль найду/напишу.
Posted via RSDN NNTP Server 2.0 beta
Re: Вот такой вот препроцессор.
От: lxa http://aliakseis.livejournal.com
Дата: 20.08.05 08:21
Оценка:
Здравствуйте, c-smile, Вы писали:
...
CS>генерировать нечто типа (в С++)

CS>

CS>struct test 
CS>{
CS>  enum _ 
CS>  {
CS>    one = 1, 
CS>    two = 2, 
CS>    three = 3, 
CS>  };

CS>  static const char* to_string( int n )
...

CS>  static int from_string( const char* str )
...

CS>};

CS>


CS>Подходов к автоматической генерации source code много.

...
CS>генератор "smart enum" для С++
...

Ну, в C/C++ уже есть препроцессор вполне могущий осилить smart enum-ы

Вот как например можно подойти к enum-ам (в конце):
http://www.codeguru.com/Cpp/Cpp/cpp_mfc/templates/article.php/c4137
или вот еще:
http://www.codeguru.com/Cpp/Cpp/cpp_mfc/serial/article.php/c8083
Re[4]: Вот такой вот препроцессор.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 20.08.05 10:42
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Подозреваю, что речь шла об использовании C# в качестве скриптового языка ("у меня не JavaScript, а C#") для препроцессирования C++.


Вот именно.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: Вот такой вот препроцессор.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 20.08.05 10:44
Оценка: :)
Здравствуйте, 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 действительно подходят. Только вот задачки в жизни бывают не только примитивные и встроенные средства быстро заканчиваются. Ну да ты наверное таких пока не решал
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Вот такой вот препроцессор.
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.08.05 11:46
Оценка:
Здравствуйте, c-smile, Вы писали:

Скачай КодСмит и не мучайся.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Вот такой вот препроцессор.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 20.08.05 12:02
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Скачай КодСмит и не мучайся.


Не скачай, а купи
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Вот такой вот препроцессор.
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 20.08.05 12:46
Оценка: :))) :)
Здравствуйте, c-smile, Вы писали:

CS>Захотелось мне вот чтобы было нечто позволяющее по струкутре вида:


CS>
CS>var enumdef = 
CS>{
CS>  name:"test",
CS>  members: 
CS>  [
CS>    { value: 1, name:"one" },
CS>    { value: 2, name:"two" },
CS>    { value: 3, name:"three"}
CS>  ]
CS>}
CS>


А так пойдет (Ruby)?

require 'enumdef'

enumdef {
    name "test"
    members [
        { :value => 1, :name => "one" },
        { :value => 2, :name => "two" },
        { :value => 3, :name => "three" }
    ]
}


Результат:

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. Тогда получится чистая декларативность:
enumdef {
    name "test"
    members [
        { :value => 1, :name => "one" },
        { :value => 2, :name => "two" },
        { :value => 3, :name => "three" }
    ]
}





Ссылки на статьи про возможности метапрограммирования на Ruby я давал здесь: Re[2]: Metaprogramming et al: Ruby?
Автор: eao197
Дата: 19.08.05





Похоже, что скоро к Сергею Губанову с Oberon, к VladD2 с C# и мне с Ruby будет в полной мере относится анекдот:

Из ленты новостей: "Недавно геологами в Сибири был найден мальчик, воспитанный в тайге дятлами. Через три дня он всех задолбал"...

... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[3]: Вот такой вот препроцессор.
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.08.05 13:08
Оценка:
Здравствуйте, adontz, Вы писали:

A>Не скачай, а купи


A>http://www.codesmithtools.com/
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Вот такой вот препроцессор.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 20.08.05 13:18
Оценка:
Здравствуйте, VladD2, Вы писали:

A>>Не скачай, а купи

A>>http://www.codesmithtools.com/

Есть Trial а не FreeWare версия
http://www.codesmithtools.com/store/pricing.aspx
A journey of a thousand miles must begin with a single step © Lau Tsu
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.