Языки программирования с русским синтаксисом

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Языки программирования с русским синтаксисом » Язык Валентина » Интерпретатор языка Валентина


Интерпретатор языка Валентина

Сообщений 61 страница 90 из 175

61

Мудрец написал(а):

Самое простое описание у языка Оберон-2, который Вы так не любите.

Я не отношусь к Оберонам в стиле люблю/не люблю. Вообще не испытываю неприязни к ним (мне больше не нравится Си, С++). Я просто пытался найти строгое описание языка, на его основе составить описание для Валентина. Попробую найти описание Оберон-2 и на его основе составить описание.

Мудрец написал(а):

За одно можете поискать такую штуку как Coco/R (Компилятор Компиляторов). Идёт весь с исходниками и примерами. Есть версия и под Дельфи.
Поигравшись с ним Вы поймёте почему так важно составить формальное описание синтаксиса языка. Coco/R позволяет по формальному описанию синтаксиса генерировать практически готовый компилятор, а именно сканер и парсер. Для получения полного компилятора нужен ещё генератор кода. Вам он по-идее даже не нужен, так как у Вас интерпретатор.

Я знаю, что необходимо формальное описание языка. Причины другие. Валентина изначально не планировалась как компилятор, отчасти там имеются "не удобные" для некоторых конструкции.
Парсер написать не сложно :), а компилятор как Вы заметили без надобности (по-крайней мере на данный момент).

0

62

Можно посмотреть описание Компонентного Паскаля, и использовать его в качестве "рыбы" :-) - есть русский перевод.
http://oberoncore.ru/blackbox/documentation - здесь ссылка

0

63

Хорошо гляну. Кстати Валентина имеет неформальное описание в файлах Поддерживаемые конструкции.rtf и Базовые концепциии языка.txt. Возможно часть вопросов не будет возникать, если предварительно с ними ознакомиться (хотя могут возникнуть новые :) ). Документация периодически обновляется и дополняется.

0

64

Еще один простенький учебный пример:

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

# Создаем хранилище чисел
Создадим переменную Число1 . Здесь будет содержаться первое число
Создадим переменную Число2 . Здесь будет содержаться второе число

# Переменные для хранения результатов вычислений
Создадим переменную Сумма . Сюда мы поместим результат от сложения обоих чисел
Создадим переменную Разность . Здесь мы будем хранить результат операции Число1 - Число2
Создадим переменную Произведение . Результат от произведения двух чисел будет помещен сюда .
Создадим переменную Частное . Это переменная будет хранить результат деления Число1 на Число2

# Получим оба числа
Число1 = Получим_строку ( '' ; 'Введите первое число' )
Число2 = Получим_строку ( '' ; 'Введите второе число' )

# Найдем сумму
Сумма = Число1 + Число2

# Найдем разность
Разность = Число1 - Число2

# Найдем произведение
Произведение = Число1 * Число2

# Найдем частное
# Здесь используется самое простое деление
# Так как пример учебный особая точность вычислений не требуется
Частное = Число1 / Число2

# Подготовим результат для отображения
Сумма = 'Сумма чисел: ' & Сумма
Разность = 'Разность чисел: ' & Разность
Произведение = 'Произведение чисел: ' & Произведение
Частное = 'Частное чисел: ' & Частное

Сумма = Сумма & Разность & Произведение & Частное

# Выведем результат на экран
Сумма = Выведем_строку_на_экран ( Сумма ; 'Результаты' )

Закончим вычисления . Работа программы завершена .

Жду замечаний и оценки. Текст набирался в Блокноте, однако автоформатирование среды разработки исправило все мои корявости :). Так и сохранил :). Операция & представляет собой конкатенацию (объединение) строк. Все остальное по идее должно восприниматься из текста и комментариев.

Отредактировано utkin295 (12-03-2009 10:22:50)

0

65

Скачал описание Оберон-2 на 20-ти страницах. Правда по английски, но там и так вроде бы все ясно :).  Для такого описания более подходит Поддерживаемые конструкции.rtf
Я его немного доработаю и слегка расширю, и он станет формальным описанием для Валентины :).

0

66

Предлагаю также использования аналога блоков Begin-End Паскаля. Хочу назвать такой блок фрагментом, а также дать ему имя для повторного использования в другом месте программы. Логика полностью аналогичная - фрагменты могут включать в себя фрагменты, но не пересекаться. Имя фрагмента позволит использовать блок многократно (но это не подпрограмма, это просто кусок программы!) в различных местах программы.
Имеются ли какие-нибудь соображения по данному вопросу?

Отредактировано utkin295 (13-03-2009 08:31:17)

0

67

Предлагаю следующий вариант:

Фрагмент Х
....
....
....

Нижняя граница фрагмента

Можно затем будет написать так:
Если ф<v, то выполним фрагмент Х

0

68

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

0

69

Использование фрагментов позволит избежать проблем в Если с ложной ветвью ИНАЧЕ в случае вложенности. Можно просто запретить непосредственную вложенность Если.

Если Х=У, то Если Х<У, то Х=У Иначе Х=Х-1

Такую двусмысленность предлагаю запретить вообще, используя что-то вроде:

Если Х=У, то
Фрагмент А
     Если Х<У, то Х=У
Нижняя граница фрагмента
Иначе Х=Х-1

или

Если Х=У, то
     Фрагмент А
         Если Х<У, то Х=У
     Нижняя граница фрагмента
Иначе
     Фрагмент В
         Х=Х-1
     Нижняя граница фрагмента

Что-то в этом роде.

0

70

http://narod.ru/disk/6618700000/Valentina alfa10.rar.html - добавлена конструкция, позволяющая создавать несколько локальных переменных метода в одной строке. Не тестировано :). Ведется формальное описание языка ;) в файле Поддерживаемые конструкции.rtf.

0

71

utkin295 написал(а):

Использование фрагментов позволит избежать проблем в Если с ложной ветвью ИНАЧЕ в случае вложенности.

Ну вот встали на известные грабельки Паскаля, которые в нём есть до сих пор :) В Обероне такой проблемы нет ;)
В Обероне проблему решили с помощью добавления обязательного закрывающего END в конструкцию IF.
Не уверен, что фрагменты удачная идея... Переменные используемые во фрагменте глобальны?

Отредактировано Мудрец (14-03-2009 11:57:50)

0

72

Сый написал(а):

Описание Глагола чем не по нраву? Раздел 15, одна страница, описание в формате «РБНФ». На чистейшем русском языке, кстати.

Я не против описания Глагола, просто я его не смотрел. Гляну, чем больше материала тем лучше.

0

73

Мудрец написал(а):

Ну вот встали на известные грабельки Паскаля, которые в нём есть до сих пор :) В Обероне такой проблемы нет ;)
В Обероне проблему решили с помощью добавления обязательного закрывающего END в конструкцию IF.
Не уверен, что фрагменты удачная идея... Переменные используемые во фрагменте глобальны?

IF-End тот же фрагмент, только не именованный, да еще привязанный к условному оператору. Можно сказать урезанная версия фрагмента. Фрагменты предполагается использовать не только для условного оператора. Это просто образец. Переменные во фрагменте зависят от места использования фрагмента. Если фрагмент в методе (это аналог функции), то переменные зависят от области видимости.
Тот же самый блок Begin-end как и в Паскале. Какие переменные в процедуре в блоке Begin-End, глобальные или локальные?
Насчет граблей, пока еще не наступил :), идея в разработке. Эта одна из причин, почему не реализована ложная версия IF.
Вас не устраивают идея фрагментов только из-за условия IF или имеются еще причины?

Отредактировано utkin295 (16-03-2009 18:48:33)

0

74

Это не устоявшееся мнение касательно применения фрагментов к условным операторам, если имеется другой вариант можно рассмотреть и его :).

0

75

utkin295 написал(а):

Вас не устраивают идея фрагментов только из-за условия IF или имеются еще причины?

Вобщем-то, я вижу, что Ваша идея фрагментов чем-то сходна с инлайн процедурами без параметров в Активном Обероне. Идея неплохая, но достаточно опасная и применяется достаточно ограниченно в основном в низкоуровневом коде, поскольку сильно полагается на текущий контекст области видимости (в Активном Обероне, например можно так писать инлайн процедуры полагаясь на содержимое регистров процессора, т.е. считая, что их содержимое корректно для выполняемой процедуры). Проблема может быть в том, что контекст может быть некорректным, -- это всё-равно как возможные проблемы с Копи-Паст кодом. В контексте одной области видимости этот код может быть корректным, а в контексте другой нет.

Отредактировано Мудрец (17-03-2009 11:33:45)

0

76

Мудрец написал(а):

Вобщем-то, я вижу, что Ваша идея фрагментов чем-то сходна с инлайн процедурами без параметров в Активном Обероне. Идея неплохая, но достаточно опасная и применяется достаточно ограниченно в основном в низкоуровневом коде, поскольку сильно полагается на текущий контекст области видимости (в Активном Обероне, например можно так писать инлайн процедуры полагаясь на содержимое регистров процессора, т.е. считая, что их содержимое корректно для выполняемой процедуры). Проблема может быть в том, что контекст может быть некорректным, -- это всё-равно как возможные проблемы с Копи-Паст кодом. В контексте одной области видимости этот код может быть корректным, а в контексте другой нет.

Ну в общем да, можно считать это аналогом встраиваемой процедуры. Не знаю как в Обероне, но применительно к С++ это действительно встраиваемая процедура (в то время как в С++ она встраивается по желанию компилятора). Возможно использование такого механизма действительно нуждается в ограничении. Предложите вариант.  Но низкоуровнего кодирования в Валентине не предусмотрено, этот механизм предлагался как аналог блоков Begin-End Паскаля.

0

77

Сый написал(а):

…END в конструкцию IF…IF-End тот же фрагмент…в блоке Begin-End…версия IF…из-за условия IF…с Копи-Паст кодом… и т.д.Какой замечательный образец чисто русской беседы чисто русских программистов. Печально, однако…

Я не значю аналогов, скажем Begin-end. Начало/конец? Не знаю есть ли это в других языках программирования...

0

78

Сый написал(а):

Рекомендую в случаях, когда возникает вопрос о том, как именовать элементарные, существовавшие ещё со времён появления высокоуровневых ЯП, конструкции, вспомнить (либо представить), как их именовали, пока ещё у русских было своё государство. Конечно, допустим, в контексте кода на языке Паскаль блок называется Begin-end. Но разве Паскаль – это единственный язык программования? При разработке нового ЯП, тем более русского, подобное проявление русофобии неуместно. Да и вообще русофобия нигде не уместна и должна наказываться и пресекаться.

И как Вы предлагаете меня наказать  :crazy: ?

0

79

Хорошо, я буду иметь это ввиду. Просто переучиваться сложно. Сплошное засилье иностранных слов в программировании.

0

80

Просмотрел книгу "Как улучшить работу ума". Один из аргументов использования русского в программировании:

ПОСТУЛАТ 2.  Легкость понимания программ — более важное требование, чем удобство их написания. Как отмечает Я. Пайл, возможность прочитать программу и отчетливо осознать ее смысл гораздо важнее, чем возможность кратко и быстро ее написать. Причиной служит одно-кратное выполнение работы автором программы и необходимость много-кратного чтения программы в течение ее жизненного цикла . Известно, что высокая удобочитаемость программ облегчает их сопровождение.

Примерно, из таких позиций я исходил при создании Валентины.

0

81

Сый написал(а):

Меру тоже знать надо.

Но постулат верный. Лучше дольше писать программу на Паскале, чем еще дольше исправлять ошибки на С++.

0

82

http://narod.ru/disk/6804658000/Valentina alfa11.rar.html - новая альфа. Все изменения указаны в файле Новое.txt.
В дальнейшем планируется сделать полностью сменяемые конструкции, то есть программист будет иметь возможность создать свой файл с настройками (описаниями наименований конструкций), затем загрузить его, загрузить и выполнить программу с конструкциями, отличными от стандартного набора интерпретатора. Предполагается возможность блокирования конструкций.
Для более удобного использования интерпретатор будет поставляться с файлом, демонстрирующим настройку подобным образом. То есть программисту достаточно будет изменить копию данного файла, вписав туда свои обозначения (допустим для лучшего совмещения с предметной областью или если он считает, что его обозначения более логичны). Эта возможность позволит составлять на Валентине программы с использованием языков родственных русскому (и, возможно, некоторых других).

0

83

Прочитал статью в http://translated.by/you/why-pascal-is- … -language/

Живущие переменные методов в Валентине - аналог статических переменных.

0

84

Глючит, так как мало времени уделяется отладке (один не успеваю). В основном это подсветка синтаксиса в среде разработке (чуть позже устраню).
Совместимость имеется ввиду для русского языка полная. Так как изначально русские обозначения прописаны в интерпретатор. Но если другой программист имеет желание использовать интерпретатор строго для своих нужд, он может заточить его под себя (например для встраивания в свои программы, такая возможность имеется).
Например, украинский, белорусский и прочее. Главное не обозначения, а порядок следования слов в предложениях. Допустим в немецком всего две формы предложений (акцентируется на местоположении глагола). Аналогично и здесь. Допустим имеется конструкция ЗАКОНЧИМ ВЫЧИСЛЕНИЯ. Переведите на немецкий. В два слова уложиться сложновато. Но здесь необходимо именно два слова.
В некоторых конструкциях отдельные слова можно заменить на какой-нибудь служебный символ, например знак тире или :, но число слов должно быть именно столько сколько их указано в русских наименованиях конструкций.
Например Добавим переменную, можно переделать в Переменная: Но два элемента должны быть обязательно. Таково устройство интерпретатора.
Но есть еще одна особенность.
Вместо ЗАКОНЧИМ ВЫЧИСЛЕНИЯ можно использовать
ЗАКОНЧИТЬ ВЫЧИСЛЕНИЯ
ЗАКАНЧИВАЕМ ВЫЧИСЛЕНИЯ
ЗАВЕРШИТЬ ВЫЧИСЛЕНИЯ
ЗАВЕРШАЕМ ВЫЧИСЛЕНИЯ
ЗАВЕРШИМ ВЫЧИСЛЕНИЯ
Иными словами в конструкциях указываются не слова, а множества слов ЗАКОНЧИТЬ ЗАКОНЧИМ ЗАКАНЧИВАЕМ и прочее.
Это и есть множественность конструкций и ее тоже можно будет использовать при создании своих альтернативных вариантов обозначений конструкций. Некоторых вариантов более двух десятков для одной конструкции. Несмотря на это они составлены так, чтобы неоднозначности при вызове не возникало. Упор делался на глаголы и времена, но есть еще и некоторые варианты существительных. Полный список всех вариантов для каждой конструкции публиковать нет смысла, я помещю его позже в описание или в отдельный файл.
Примерно вот так.

Отредактировано utkin295 (19-03-2009 19:45:45)

0

85

Сый написал(а):

> украинский, белорусскийС каких пор диалекты русского языка называются "родственными языками"? Противно читать. Про русофобию, кажется, я уже писал в другой теме.

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

0

86

Мне также необходима помощь в формировании конструкций, возможно некоторые из них подобраны неправильно и нуждаются в замене (дело 5-ти минут). Чуть позже я опубликую правила формирования и сами конструкции.

0

87

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

0

88

http://narod.ru/disk/6883273000/Valentina alfa12.rar.html - версия позволяющая производить смену конструкций. В качестве примера можно использовать файл Формирование конструкций.txt Этот образец загружает те конструкции, которые используются на данный момент. Необходимо только помнить, что множества для составления конструкций иногда используются для образования нескольких конструкций (создание переменных и прочее). # - строки комментарии, в них помещен пример использования и построения конструкций (чтобы иметь представление, о том как лучше заменить).

Убрал некоторые баги (те, что сильнее всего проявляются).

Отредактировано utkin295 (22-03-2009 09:12:06)

0

89

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

0

90

Сый написал(а):

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

"Насоздавать" свои конструкции предполагается только для узкоспециализированных задач. Допустим делает человек программу для расчета химических формул, вот он и введет те конструкции, которые ему  ближе (имеется возможность и блокирования конструкций). Для использования большим сообществом мне кажется нужен стандарт. Причем стандарт для русского языка, стандарт для других языков (если действительно это будет возможно не только для наречий русского). У меня есть набор конструкций, но это мой набор, он стандартом не является. Возможно совместными усилиями этот вопрос можно будет решить. Я подготовлю список и выложу для обсуждения. Для стандартизированных конструкций будет введена возможность автоматического перевода с одного языка на другой. Таким образом, программист будет всегда иметь возможность прочесть программу на том языке, который ему будет нужен (или который для него ближе).

Отредактировано utkin295 (22-03-2009 09:28:56)

0


Вы здесь » Языки программирования с русским синтаксисом » Язык Валентина » Интерпретатор языка Валентина