Войти
ФлеймФорумПроЭкты

Метаязык ν (Ню, Nu) (8 стр)

Страницы: 13 4 5 6 7 8
#105
(Правка: 14:31) 14:29, 4 фев. 2019

Great V.
>Основные сущности здесь - контексты и функции.
  Я на твоем месте поднял бы все это на более высокий уровень
до объектов и их функций.


#106
17:40, 4 фев. 2019

Бабер
> Я на твоем месте поднял бы все это на более высокий уровень
> до объектов и их функций.
Можно подробнее?
А то звучит так будто бы ты имеешь ввиду обычное ООП. В понимании объектов и методов.

#107
17:53, 4 фев. 2019

>Можно подробнее?
>А то звучит так будто бы ты имеешь ввиду обычное ООП. В понимании объектов и методов.
  В смысле не углубляясь в ассемблер и в синтаксис языка,
а разрабатывая новый уровень абстракции.
  То есть, есть контейнер, и в него как в список list или map можно добавлять структуры,
удалять их.

  Каждая структура содержит в себе функцию и затем в зависимости
от контекста (т.е. ключа mapa) можно вызывать структуру с соответствующей
ей функцией.

  Манипулируя содержимым этого контейнера можно изменять программу
без перекомпиляции.

#108
18:10, 4 фев. 2019

Бабер
> В смысле не углубляясь в ассемблер и в синтаксис языка
Так в этом и суть. Мне нужен очень гибкий синтаксис.

> То есть, есть контейнер, и в него как в список list или map можно добавлять
> структуры,
> удалять их.
Какой-то JavaScript. Можно пару примеров кода?

#109
(Правка: 19:07) 18:39, 4 фев. 2019

Great V.
> Какой-то JavaScript. Можно пару примеров кода?
  Ну вот смотри:

#include <string>
#include <map>

using namespace std;

class CFunction
{
  virtual void Draw();
};

class CRect : public СFunction
{
  void Draw(); // эта рисует квадрат
};

class CLine: public СFunction
{
  void Draw(); // эта рисует прямую
};

class CCircle : public СFunction
{
  void Draw(); // эта рисует окружность
};

CRect Rect;
CLine Line;
CCircle Circle;

int main(int argc, char* argv[])
{
  map<string, СFunction> FunctionMap; //Создаем контейнер

  FunctionMap.insert(make_pair("квадрат", Rect)); //Заполняем его
  FunctionMap.insert(make_pair("прямая", Line));
  FunctionMap.insert(make_pair("окружность", Circle));

  FunctionMap["окружность"].Draw(); // Вывод в зависимости от контекста

  return 0;
}
#110
21:06, 4 фев. 2019

Бабер
Это конечно круто... но тут фиксированный синтаксис. Да и это тот же JavaScript : )

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

#111
18:09, 5 фев. 2019

Great V.
> Контекст можно изменять, добавляя в него новые функции
Вот весело будет, когда через 10 уровней вызова тебе кто-то переопределит функцию.

#112
(Правка: 19:05) 19:03, 5 фев. 2019

Panzerschrek[CN]
> Вот весело будет, когда через 10 уровней вызова тебе кто-то переопределит
> функцию.
Перекрытие существует и в современных языках, проблема не новая.
Но тут есть другая идея: добавляя в контекст определенную функцию можно изменить его так, чтобы в дальнейшем у пользователя уже не было возможности ее переопределить.
Более того, это все очень низкий уровень синтаксиса. Для большинства задач есть смысл использовать готовые библиотеки, где весь этот менеджмент контекста делается за пользователя.

А вообще ничего плохого в переопределении нет. С его помощью можно делать контекстно-зависимые конструкции. Главное после выхода из такой конструкции вернуть синтаксис на место.

#113
(Правка: 18:42) 18:39, 6 фев. 2019

Исправленная версия кода из поста №109

+ Показать

Без указателей эта конструкция не компилируется

#114
(Правка: 23:30) 23:26, 18 мая 2019

Короче, работаю над очередным прототипом...

Цель - создать язык для распознавания контекстно-зависимых языков. Но на этот раз конечный язык (тот, который распознается) должен уметь изменять правила анализа.
Другими словами теперь можно задать правила так, чтобы язык мог сам изменять их в процессе собственного же анализа. Такой себе eval в мире BNF.

Сам язык пока достаточно прост и состоит всего лишь из четырех инструкций:
1. Объявление программы (функции).

f: program(x,y) {
    ...
}
2. Объявление оператора (сущность, которая обрабатывает текст).
a: operator "a" {
    ...
}
3. Возвращение результата.
return x
4. Вызов функции.
r: f(x,y)

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

Т.е. теоретически в первых строчках программы можно описать BNF. Потом расширить его для работы с контекстом и навалять базовые операции любого языка программирования.
А дальше - все что хочешь. Хоть linq, хоть шаблоны, хоть разметка, хоть функциональное программирование.

#115
22:29, 27 июля 2019

Навалял еще один прототип.
На этот раз брал за основу не обычный текст, а последовательность токенов. Всего их четыре типа:

1. Идентификаторы. Непрерывные последовательности из букв, цифр и символов "~!@#$%^&*-=_+/|\<>?".
2. Литералы. Строки в кавычках, причем открывающая и закрывающая кавычка могут не совпадать.
3. Группы. Последовательность токенов заключенная между скобкок {[( и }]). Тип открывающей и закрывающей скобки может не совпадать.
4. Специальные символы ".,:;".

Программа как и раньше имеет доступ к своему исходному коду, но теперь в виде массива этих токенов.
Синтаксис тоже предельно простой: объявление функций, вызов, возвращение результата и ветвление.

+ Показать

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

+ Показать

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

Страницы: 13 4 5 6 7 8
ФлеймФорумПроЭкты