Простой парсер

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

Модератор: BV

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Простой парсер

Сообщение iGrok » 06.01.2011 (Чт) 19:39

uni писал(а):Зарплате 1С'овцев можно позавидовать, они никогда не остануться без работы. Какие ещё последствия?

Излишнее упрощение часто тоже бывает вредным.

Я знаю достаточно много 1Совцев. БОльшая часть из них - однорукие макаки с сертификатами 1С. Меньшая часть - хорошие программисты.
Догадаешься, какая из этих двух частей начинала обучаться программированию именно на 1С?

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

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

То есть либо так:
Код: Выделить всё
Public Sub AddItem(Name As String, Property As Integer, Content As ImageOfResult)
    Dim _Name As New CString
    Dim _Property As New CInteger
   
    _Name.StringValue = Name
    _Property.IntegerValue = Property
   
    Me.Names.addElement (CVar(_Name))
    Me.Properties.addElement (CVar(_Property))
    Me.Content.addElement (CVar(Content))
End Sub


Либо так:
Код: Выделить всё
Общая Процедура ДобавитьЭлемент(Имя Как Строка, Свойство Как Целое, Содержимое Как ОбразРезультата)
    Объявить внИмя Как Новый КлСтрока
    Объявить внСвойство Как Новый КлЦелое
   
    внИмя.СтроковоеЗначение = Имя
    внСвойство.ЦелоеЗначение = Свойство
   
    ТекущийОбъект.Имена.ДобавитьЭлемент (ВУниверсальный(внИмя))
    ТекущийОбъект.Свойства.ДобавитьЭлемент (ВУниверсальный(внСвойство))
    ТекущийОбъект.Содержимое.ДобавитьЭлемент (ВУниверсальный(Содержимое))
Конец Процедуры


Но ни в коем случае не так:
Код: Выделить всё
Public Sub ДобавитьЭлемент(Имя As String, Свойство As Integer, Содержимое As ОбразРезультата)
    Dim внИмя As New CString
    Dim внСвойство As New CInteger
   
    внИмя.StringValue = Имя
    внСвойство.IntegerValue = Свойство
   
    Me.Имена.addElement (CVar(внИмя))
    Me.Свойства.addElement (CVar(внСвойство))
    Me.Содержимое.addElement (CVar(Содержимое))
End Sub
label:
cli
jmp label

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Простой парсер

Сообщение Proxy » 06.01.2011 (Чт) 19:43

uni писал(а):Программист - тот, кто умеет писать программы. А кто-то из великих сказал, что программа - это структура данных и алгоритм. Где тут про язык? И по секрету скажу, что даже детей можно научить этому не сложному делу :)

А секретутка, которая пишет на листе для заметок "купить после работы кефир, но если кефира нет, то купить ряженку. разбудить мужа. если муж не спит, то сосат. конец." — она тру программист? Она тоже создаёт алгоритм (а потом даже отлаживает, ага :D Степ-бай-степ) и структура кода на этом листке вполне определённая. И с тем же успехом она в спецификацию RFC 959 она не вкурит.

http://binardik.ru/

"аштэтэпэ://бинардик.ру" должно быть имелся ввиду? Не? А то как-то не православно :D .
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простой парсер

Сообщение Хакер » 06.01.2011 (Чт) 19:59

Кстати, заметил поразительное сходство uni с другим участником нашего форума.

Да-да, товарищ Zenitchik (даже ник имеет некоторую связь с упоминаемой здесь зенитно-ракетной системой С-300) — тоже инженер от военных, тоже занимался чем-то оборонным, тоже вступал со мной в спор, занимаясь написанием парсера с использованием КА, но самое главное, это его подпись:
Зенитчик в подписи писал(а):Знание английского языка — затрудняет понимание кода.


Складывается впечатление, что где-то в подвалах оборонных учреждений новоиспечённым офицерам с помощью секретных военных методов прививают ненависть к латинице и английскому языку :alien: .
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

uni
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 105
Зарегистрирован: 05.05.2006 (Пт) 15:24
Откуда: Екатеринбург

Re: Простой парсер

Сообщение uni » 06.01.2011 (Чт) 20:05

Proxy, я не православный, я внеконфессионально верющий Богу, если это тебя так заинтересовало.

По поводу применения парсера.
Когда-то я работал в одной фирме, где делали универсальный конфигуратор для модульных приборов АСУТП. Писали на C++ Builder. Конфигуратор - это настроечная утилитка для начального конфигурирования и слежения за работой модуля. Она имеет интерфейс, а поскольку таких модулей много (у каждого ещё несколько станиц настроечных параметров), а начинка у конфигураторов одинаковая, то встал вопрос: как менять интерфейс конфигуратора в зависимости от типа модуля, набора параметров? Делали так. На форме клали много много панелей - каждая для своего типа модуля. Надо сказать не часто увидишь проект, для управления которым реально не хватает средств IDE C++ Builder 6. Элементов управления стало так много, что навигировать в среде просто ужасно.

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

К чему я веду, можно читать *.frm файлы парсером и самостоятельно в runtime управлять видом интерфейса. Т.е. может пригодится при разработке проекта своей IDE для чего-нибудь.

Хакер, я тут появляюсь по статистике 1 раз в 4 года судя по всему. Я уже 11 лет не меняют своего ника: uni или уни. Везде на форумах имею только один из этих вариантов в зависимости от занятости ника. Моя аська тоже долгожитель примерно с таким же сроком и под тем же ником. 11 лет назад мне надоело придумывать ники и я сел, подумал и выбрал для себя простой, короткий ник со смыслом. С тех пор и по сей день... мне лень придумывать ники.
Россия навсегда!
Сетрификаты

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: Простой парсер

Сообщение Alec » 06.01.2011 (Чт) 20:06

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

То-то же и оно, попробуй в своем коде допустить ошибку типа "МйоКласс.Свосйтво1=1" и сразу ее найти? Лично для меня латинские символы в коде и являются частью кода, без особого осмысления. Когда я только начинал учиться я и слов-то английских не знал, и как читаются тем паче.
Proxy писал(а):"аштэтэпэ://бинардик.ру" должно быть имелся ввиду? Не? А то как-то не православно .

Ээх, отстаешь от жизни. Не ".ру", а ".рф" :D. Да, и тогда уж не "аштэтэпэ", а что-то типа "пргт://"
PS. Однозначно нужен холивар с опросом, иначе кто-то попадет под горячую руку модераторов за оффтоп...
Иногда лучше вовремя остановиться...
И начать заново!

uni
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 105
Зарегистрирован: 05.05.2006 (Пт) 15:24
Откуда: Екатеринбург

Re: Простой парсер

Сообщение uni » 06.01.2011 (Чт) 20:40

То-то же и оно, попробуй в своем коде допустить ошибку типа "МйоКласс.Свосйтво1=1" и сразу ее найти?
Такие ошибки уже давно отпадают на этапе кодирования. "МйоКласс" не пропустит поле "Свосйтво1" - это искусственный пример. Зачем он вам? Такого сейчас не бывает. Придумайте что-то из реалий практики ошибок.

Из истории этого проекта: MC14 Interpreter 0.9 Source code (rus)

Код: Выделить всё
Общая Процедура ДобавитьЭлемент(Имя Как Строка, Свойство Как Целое, Содержимое Как ОбразРезультата)
    Объявить внИмя Как Новый КлСтрока
    Объявить внСвойство Как Новый КлЦелое
   
    внИмя.СтроковоеЗначение = Имя
    внСвойство.ЦелоеЗначение = Свойство
   
    ТекущийОбъект.Имена.ДобавитьЭлемент (ВУниверсальный(внИмя))
    ТекущийОбъект.Свойства.ДобавитьЭлемент (ВУниверсальный(внСвойство))
    ТекущийОбъект.Содержимое.ДобавитьЭлемент (ВУниверсальный(Содержимое))
Конец Процедуры
А это я возьму как пример для ключевых слов интерпретатора. У меня есть мысли уже как сделать циклы и объявление функций, но не знал что взять в качестве ключевых слов. Я сделаю ключевые слова дублированными, т.е. на выбор: английская или русская нотация.
Россия навсегда!
Сетрификаты

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Re: Простой парсер

Сообщение 1Steps » 07.01.2011 (Пт) 2:13

uni писал(а):Из истории этого проекта: MC14 Interpreter 0.9 Source code (rus)

Код:
Общая Процедура ДобавитьЭлемент(Имя Как Строка, Свойство Как Целое, Содержимое Как ОбразРезультата)
    Объявить внИмя Как Новый КлСтрока
    Объявить внСвойство Как Новый КлЦелое
   
    внИмя.СтроковоеЗначение = Имя
    внСвойство.ЦелоеЗначение = Свойство
   
    ТекущийОбъект.Имена.ДобавитьЭлемент (ВУниверсальный(внИмя))
    ТекущийОбъект.Свойства.ДобавитьЭлемент (ВУниверсальный(внСвойство))
    ТекущийОбъект.Содержимое.ДобавитьЭлемент (ВУниверсальный(Содержимое))
Конец Процедуры


Какой ужас :shock:
Я если вижу русский(кроме пояснений) в названии переменных, я даже не смотрю на дальнейший код.
Меня просто рвёт. :D

Я этот топик больше не читаю. :mrgreen:
Удалена за ненадобностью.

uni
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 105
Зарегистрирован: 05.05.2006 (Пт) 15:24
Откуда: Екатеринбург

Re: Простой парсер

Сообщение uni » 07.01.2011 (Пт) 4:27

Хорошо, давайте я буду предлагать варианты конструкций, а вы говорите вместе что наиболее плохо. Давайте ориентироваться на эту тему и этот проект. Чтобы приступить к более стложным структурам, нужно их записать в виде грамматики или хотя бы просто пофантазировать. Представим, что у нас выпустили отечественный микроконтроллер (КР1878ВЕ1), но, увы, не нашлось спецов, способных разработать собственный современный Ассемблер и тем более си-подобный язык (не говоря уже о среде разработки) и вот нам выпала честь поработать в этом направлении. Я буду брать пример с явы и си шарпа.

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

К примеру, комбинации циклов по-русски (я полагаю применение юникода):
цикл (параметры) {
список выражений
}

цикл пока условие {
список выражений
}

цикл {
список выражений
} пока условие

Как бы это выглядело на деле:

цикл ( ii = 0; ii < Имена.Размер(); ii++ ) {
строка = ( Строка ) Имена.ЭлементN(ii);
если ( строка.Равна( имя ) ) {
возврат ( ОбразРезультата ) Значения.ЭлементN(ii);
}
}

или

цикл {
имя = ( Строка ) Имена.ЭлементN( ii );
// ...
} пока ( строка.Равна( имя ) )

Условия:
если условие {
список выражений
} иначе {
список выражений
}

Замена терминов:
class - класс, образ
public - ?
private - ?
new - ?
return - возврат
boolean - булевое
byte - байт
int - целое
long - длинное
string - строка
Россия навсегда!
Сетрификаты

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Re: Простой парсер

Сообщение FaKk2 » 07.01.2011 (Пт) 9:32

почему ii то? почему не и или еще лучше ы.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

uni
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 105
Зарегистрирован: 05.05.2006 (Пт) 15:24
Откуда: Екатеринбург

Re: Простой парсер

Сообщение uni » 07.01.2011 (Пт) 15:28

Потому что и в русском языке имеет образ союза, а не индекса как в английском. Про ы я вообще молчу.
Давайте по теме и думая.
Россия навсегда!
Сетрификаты

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Простой парсер

Сообщение Joo » 07.01.2011 (Пт) 18:28

uni писал(а):цикл ( ii = 0; ii < Имена.Размер(); ii++ ) {
строка = ( Строка ) Имена.ЭлементN(ii);
если ( строка.Равна( имя ) ) {
возврат ( ОбразРезультата ) Значения.ЭлементN(ii);
}
}

Приехали, теперь код на русском, а имена переменных на английском.
uni писал(а):Потому что и в русском языке имеет образ союза

Ну можно же обозвать Индекс, или сокращенно инд
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

uni
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 105
Зарегистрирован: 05.05.2006 (Пт) 15:24
Откуда: Екатеринбург

Re: Простой парсер

Сообщение uni » 08.01.2011 (Сб) 16:09

Так можно. Согласен. Исходники будут на юникоде, я потом перепешу парсер под юникод. Поэтому ему безразлично будет язык ввода, главное - грамматика, т.е. правила написания. Я бы ещё предложил сокращение Сч. Индекс - это вспомогательный объект блока программы, не несущий основную смысловую нагрузку. Я сам себя не могу переориентировать на то, чтобы писать чисто по-русски. Хотя я уже достаточно много написал русифицированного кода (целый проект даже есть), но всё равно опыта мало.

В принципе, потом можно приделать компилятор в MSIL и тогда это будет полноценный учебный русский язык программирования ;) для .NET. Это проще, чем обычный ассемблер.
Россия навсегда!
Сетрификаты

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Простой парсер

Сообщение Joo » 08.01.2011 (Сб) 17:01

uni писал(а):В принципе, потом можно приделать компилятор в MSIL и тогда это будет полноценный учебный русский язык программирования для .NET.

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

p.s. Хакер, сделай пожалуйста, если это возможно, чтобы BB код URL нормально переваривал ссылки с русскими словами, а то невозможно ссылку на википедию нормально разместить.
Не так:
Код: Выделить всё
[url]http://ru.wikipedia.org/wiki/КуМир_(система_программирования)[/url]

Не так:
Код: Выделить всё
[url=http://ru.wikipedia.org/wiki/КуМир_(система_программирования)]КуМир[/url]
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Простой парсер

Сообщение Debugger » 08.01.2011 (Сб) 17:51

Затея хорошая. Но ребятки не должны учиться с такого языка. Не должны они начинать программировать с Pascal ABC, как сейчас. Ассемблер - вот выбор настоящего джедая.

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Простой парсер

Сообщение Joo » 08.01.2011 (Сб) 17:55

Debugger писал(а):Но ребятки не должны учиться с такого языка

Совершенно согласен. Можно ради спортивного интереса написать свой интерпритатор/компилятор с русским синтаксисом, но не как не изучть его(только если его код ;-) ).
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

uni
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 105
Зарегистрирован: 05.05.2006 (Пт) 15:24
Откуда: Екатеринбург

Re: Простой парсер

Сообщение uni » 08.01.2011 (Сб) 19:02

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

(я достаточно хорошо знаю ассемблер и не один даже)

Не пк-шные языки это: языки экспертных систем, МЭК языки промышленного кодинга (STL, LAD и т.д.) - там вам знание ассемблера или ЯВУ мало помогут, да и принципы построения программ тоже.

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

Я разделю эту тему на две: Калькулятор и Парсер, т.к. грамматика будет разной. У Калькулятора - заточена под визуальный интерфейс, а у Парсера - экспериментальная.

Визуальный калькулятор выделен в отдельный проект: https://mysvn.ru/cop/Calculator/
Для клиентов SVN анонимный доступ для чтения.
Россия навсегда!
Сетрификаты

uni
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 105
Зарегистрирован: 05.05.2006 (Пт) 15:24
Откуда: Екатеринбург

Re: Простой парсер

Сообщение uni » 11.01.2011 (Вт) 22:58

А сам парсер остался по старому адресу (svn): https://Anonymous@mysvn.ru/cop/Parser
скрин8.jpg


Разбор по нажатию на F5.
У вас нет доступа для просмотра вложений в этом сообщении.
Россия навсегда!
Сетрификаты

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Простой парсер

Сообщение iGrok » 11.01.2011 (Вт) 23:09

Булевы значения более логично было бы обозвать не "да" и "нет", а "истина" и "ложь".
label:
cli
jmp label

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Простой парсер

Сообщение Proxy » 11.01.2011 (Вт) 23:29

почему "sin", а не "син", "pi", а не "пи" и т.д? Т.к. это математические константы и математические функции, которые не определены на русском языке только? На фоне перевода всего кода на русский выглядит столь же нелогично. Т.е. базовый английский всё равно придётся учить? Ого, да и математику придётся же учить... не комильфо, в идеологию не укладывается.
Заранее извиняюсь, если мои посты покажутся кому-то стёбными, я не могу что-либо конструктивное писать в этой ветке, у меня неконтролируемые приступы смеха возникают уже.
Follow the white rabbit.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простой парсер

Сообщение arthur2 » 11.01.2011 (Вт) 23:45

Proxy писал(а):у меня неконтролируемые приступы смеха возникают уже
Ну и напрасно - проект интересный.
Ты за "нетакими" буквами не видешь интересного кода. Это просто твоя проблема восприятия.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простой парсер

Сообщение Хакер » 11.01.2011 (Вт) 23:51

arthur2 писал(а):Ну и напрасно - проект интересный.
Ты за "нетакими" буквами не видешь интересного кода. Это просто твоя проблема восприятия.

Где интересный код, прости?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простой парсер

Сообщение arthur2 » 11.01.2011 (Вт) 23:56

Мне - интересный.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простой парсер

Сообщение Хакер » 12.01.2011 (Ср) 0:46

Значит не напрасно?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 386
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Простой парсер

Сообщение NashRus » 12.01.2011 (Ср) 1:47

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

uni
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 105
Зарегистрирован: 05.05.2006 (Пт) 15:24
Откуда: Екатеринбург

Re: Простой парсер

Сообщение uni » 12.01.2011 (Ср) 3:52

Булевы значения более логично было бы обозвать не "да" и "нет", а "истина" и "ложь".
Да, изначально я так и сделал. Но потом решил поэкспериментировать. Это не окончательный вариант. Тому есть причина. Кто перешёл на .Net, тот знает, что переменные там стали классами и потому многие выражения с промверками некоторых условий стали иметь совершенно иной вид, к примеру, проверка строки на равенство другой строке записывается теперь через функцию .equals(), а ранее с процедурной парадигмой писали явно: Str2 == Str2 или if Str1 == "abc". То же в некоторой мере относится и к другим типам. Таким образом, если попробовать понимать: если строка.equals(строка2) == истина { } - это не "звучит", а вот это звучит: если строка.equals(строка2) == да { }. Я ещё не придумал замены для equals. Мои строки (CString) в программе, как Вы заметили, тоже классы и в своём синтаксисе я бы тоже потом хотел придерживаться такого современного подхода.

Или ещё пример:
Код: Выделить всё
Private Sub РазделительПравый_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    If ПравыйРазделительДвижется Then
        РазделительПравый.Left = РазделительПравый.Left + x - НачX
       
        ПанельОсновная.Width = РазделительПравый.Left
       
        ПанельПравая.Left = РазделительПравый.Left + РазделительПравый.Width
        ПанельПравая.Width = Me.ScaleWidth - ПанельПравая.Left
       
        ОбновитьПравуюПанель
        ОбновитьОсновнуюПанель
    End If
End Sub

Что было бы тут уместнее? С моей точки зрения If ПравыйРазделительДвижется = истина Then хуже, чем If ПравыйРазделительДвижется = да Then. Короче говоря, много ли вы встречали абстрактных логических выражений? Я таких не припомню. Булевую переменную обычно объявляют как результат (признак) законченного или продолжающегося действия, поэтому да и нет звучат вполне логично. Состояние же объекта (не действия) описывать булевым типом не хорошо, для этого есть перечисления, т.к. всегда должен быть и третий вариант: не определено (не известно). Когда начинаешь программить по-русски, то приходит понимание написанного. Даже если взять работу с теми же битами:
Код: Выделить всё
Бит7Установлен = (Bits And &H80) <> 0
' или
Бит7Установлен = ((Bits And &H80) <> 0) = да)
Тут да и нет сами напрашиваются.

Я посмотрел местный код другого калькулятора (обработка ошибок там, мягко говоря, слабовата, я уж не говорю про полное отсутствие идентификаторов-констант):
[Парсер] Еще один Эвалютатор мат. выражений
и, честно говоря, хотел бы направить свой код в то же русло, только у меня будет нормальный языковой синтаксис на подобии си шарпа или явы. Мой код, так скажем, слегка примитивен. По-настоящему, конечно, нужно преобразовывать выражение в ОПЗ, как делается в математических программах и, наверное, в компиляторах. Мне хочется потом перевести код в листинг на MSIL, чтобы компильнуть хотя бы в консольную прогу для .Net. А для этого мне нужно дерево инструкций, что делается как раз при помощи ОПЗ.

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

П.С. С equals() пример не совсем верный. Это из Java я взял, в C# его переопределять для этих целей надо.
Ах, да... почему же тогда используются true и false, ведь они могли бы использовать yes и no? Может быть это исторически так сложилось? Раньше ведь объектности в массе своей такой не было. Вот и привыкли.

:) Это даже немного смешно. Вот взять таблицу свойств компонента и пройтись по некоторым булевым свойствам:
Enabled, HideSelection, Locked, Visible и т.д.

Неужели значения истина и ложь для них смотрятся естественно? Если реально не понимать их смысла, то всё равно, а вот если докапываться до этого, то как-то странно звучит. В MS Access для логического типа поля можно выбрать три варианта формата вывода: Истина/Ложь, Да/Нет и Вкл/Выкл.
Россия навсегда!
Сетрификаты

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Простой парсер

Сообщение pronto » 12.01.2011 (Ср) 15:24

uni писал(а):Я посмотрел местный код другого калькулятора (обработка ошибок там, мягко говоря, слабовата, я уж не говорю про полное отсутствие идентификаторов-констант)

Ложь :) . Идентификаторы-константы присутсвуют, но в силу отсутствия оператора присвоения они назначаются до компиляции.
Кстати, о компиляции. Реальной практической пользы в этом нет, так как сложно составить конкуренцию большей массе популярных компиляторов. А для тренировок и оттачивания приёмов достаточно интерпретатора. Если в нём будут реализованы структуры Ветвление, Цикл и Вложение, то это уже обеспечивает большие возможности алгоритмистики.
O, sancta simplicitas!

uni
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 105
Зарегистрирован: 05.05.2006 (Пт) 15:24
Откуда: Екатеринбург

Re: Простой парсер

Сообщение uni » 12.01.2011 (Ср) 16:26

pronto, я про другое:
Код: Выделить всё
' Элементы разбора
Public Const ЭЛЕМЕНТ_НЕИЗВЕСТЕН = 0
Public Const ЭЛЕМЕНТ_ИМЯ = 1
Public Const ЭЛЕМЕНТ_ЧИСЛО = 2
Public Const ЭЛЕМЕНТ_КОНЕЦ = 3
Public Const ЭЛЕМЕНТ_ПЛЮС = 4
Public Const ЭЛЕМЕНТ_МИНУС = 5
Public Const ЭЛЕМЕНТ_УМНОЖИТЬ = 6
Public Const ЭЛЕМЕНТ_ДЕЛИТЬ = 7
Public Const ЭЛЕМЕНТ_РАВНО = 8
Public Const ЭЛЕМЕНТ_ЛЕВАЯСКОБКА = 9
Public Const ЭЛЕМЕНТ_ПРАВАЯСКОБКА = 10
Public Const ЭЛЕМЕНТ_СТЕПЕНЬ = 11
Public Const ЭЛЕМЕНТ_ВЫВОД = 12
Public Const ЭЛЕМЕНТ_ЗАПЯТАЯ = 13
Public Const ЭЛЕМЕНТ_ЛЕВАЯКВАДРСКОБКА = 14
Public Const ЭЛЕМЕНТ_ПРАВАЯКВАДРСКОБКА = 15
Public Const ЭЛЕМЕНТ_ФАКТОРИАЛ = 16
Public Const ЭЛЕМЕНТ_БОЛЬШЕ = 17
Public Const ЭЛЕМЕНТ_МЕНЬШЕ = 18
Public Const ЭЛЕМЕНТ_МЕНЬШЕРАВНО = 19
Public Const ЭЛЕМЕНТ_БОЛЬШЕРАВНО = 20
Public Const ЭЛЕМЕНТ_НЕРАВНО = 21
Public Const ЭЛЕМЕНТ_МЕНЬШЕБОЛЬШЕ = 21
Public Const ЭЛЕМЕНТ_ДВОЕТОЧИЕ = 22
Public Const ЭЛЕМЕНТ_ПРИСВОИТЬ = 23
Public Const ЭЛЕМЕНТ_ТЕКСТ = 24
Public Const ЭЛЕМЕНТ_КАВЫЧКИ = 25
Public Const ЭЛЕМЕНТ_КЛЮЧЕВОЕ_СЛОВО = 26
Public Const ЭЛЕМЕНТ_ПОДЧЁРКИВАНИЕ = 27
Public Const ЭЛЕМЕНТ_КОММЕНТАРИЙ = 28

' Свойства элементов таблицы переменных
Public Const СВОЙСТВО_КОНСТАНТА = 0
Public Const СВОЙСТВО_ПЕРЕМЕННАЯ = 1
Public Const СВОЙСТВО_ФУНКЦИЯ = 2

' Поддерживаемые парсером типы
Public Const ТИП_НЕИЗВЕСТЕН = 0
Public Const ТИП_СКАЛЯР = 1
Public Const ТИП_СТРОКА = 2
Public Const ТИП_ВЕКТОР_1x1 = 3
Public Const ТИП_ВЕКТОР_СТОЛБЕЦ = 4
Public Const ТИП_ВЕКТОР_СТРОКА = 5
Public Const ТИП_МАТРИЦА = 6
Public Const ТИП_ЛОГИКА = 7
Public Const ТИП_ПУТЬ = 8

' Идентификаторы ошибок
Public Const ОШИБОК_НЕТ = 1000
Public Const ОШИБКА_НЕИЗВЕСТНАЯ = 1001
Public Const ОШИБКА_НЕИЗВЕСТНОЕ_ИМЯ = 1002
Public Const ОШИБКА_ТАБЛИЦА_ПУСТА = 1003
Public Const ОШИБКА_ИЗМЕНИТЬ_НЕЛЬЗЯ = 1004
Public Const ОШИБКА_НЕСООТВЕТСТВИЕ_ТИПА = 1005
Public Const ОШИБКА_НЕИЗВЕСТНЫЙ_ЭЛЕМЕНТ_РАЗБОРА = 1006
Public Const ОШИБКА_ОЖИДАЕТСЯ_ПРАВАЯ_КВАДР_СКОБКА = 1007
Public Const ОШИБКА_ОЖИДАЕТСЯ_ПРАВАЯ_СКОБКА = 1008
Public Const ОШИБКА_ДЕЛЕНИЕ_НА_НОЛЬ = 1009
Public Const ОШИБКА_ПРИ_ПРИСВОЕНИИ = 1010
Public Const ОШИБКА_НЕИЗВЕСТНОЕ_ИМЯ_ЭЛЕМ_РАЗБОРА = 1011
Public Const ОШИБКА_НЕИЗВЕСТНЫЙ_СИМВОЛ = 1012
Public Const ОШИБКА_НЕИЗВЕСТНОЕ_ИМЯ_ФУНКЦИИ = 1013
Public Const ОШИБКА_ОЖИДАЕТСЯ_ВЫРАЖЕНИЕ = 1014
Public Const ОШИБКА_НЕИЗВЕСТНЫЙ_ИДЕНТИФИКАТОР = 1015
Public Const ОШИБКА_ОЖИДАЕТСЯ_ОПЕРАНД = 1016
Public Const ОШИБКА_ОЖИДАЕТСЯ_ВЫВОД = 1017
Public Const ОШИБКА_ОЖИДАЕТСЯ_КАВЫЧКА = 1018
Public Const ОШИБКА_НЕИЗВЕСТНОЕ_КЛЮЧЕВОЕ_СЛОВО = 1019

' Ошибки при чтении файла
Public Const ОШИБКА_ОТКРЫТИЯ_ФАЙЛА = 1020

Идентификаторы-константы присутсвуют, но в силу отсутствия оператора присвоения они назначаются до компиляции.
Это я заметил. У меня тоже константы назначаются до интерпретации:
Код: Выделить всё
Public Sub Создать(Текст As String)
    Очистить
   
    Me.Текст = Текст
    Свойства.Размер = Len(Текст)
   
    Dim рез As New ОбразРезультата
    рез.CreateDouble (3.1415926535)
    Переменные.ДобавитьЭлемент "pi", СВОЙСТВО_КОНСТАНТА, рез
       
    Set рез = New ОбразРезультата
    рез.CreateDouble (2.718281828)
    Переменные.ДобавитьЭлемент "e", СВОЙСТВО_КОНСТАНТА, рез
   
    Set рез = Nothing
    Переменные.ДобавитьЭлемент "abs", СВОЙСТВО_ФУНКЦИЯ, рез
    Переменные.ДобавитьЭлемент "arctg", СВОЙСТВО_ФУНКЦИЯ, рез
    Переменные.ДобавитьЭлемент "cos", СВОЙСТВО_ФУНКЦИЯ, рез
    Переменные.ДобавитьЭлемент "exp", СВОЙСТВО_ФУНКЦИЯ, рез
    Переменные.ДобавитьЭлемент "ln", СВОЙСТВО_ФУНКЦИЯ, рез
    Переменные.ДобавитьЭлемент "log", СВОЙСТВО_ФУНКЦИЯ, рез
    Переменные.ДобавитьЭлемент "sign", СВОЙСТВО_ФУНКЦИЯ, рез
    Переменные.ДобавитьЭлемент "sin", СВОЙСТВО_ФУНКЦИЯ, рез
    Переменные.ДобавитьЭлемент "sqrt", СВОЙСТВО_ФУНКЦИЯ, рез
    Переменные.ДобавитьЭлемент "tg", СВОЙСТВО_ФУНКЦИЯ, рез
End Sub

Кстати, о компиляции. Реальной практической пользы в этом нет, так как сложно составить конкуренцию большей массе популярных компиляторов.
Это правда, но есть и исключения. К примеру, мне лично не понравился Ассемблер к нашему отечественному микроконтроллеру КР1878ВЕ1. Средств разработки для него нормальных нет. Вряд ли кто из иностранных товарищей будет развивать наш отечественный контроллер. Какой можно сделать из этого вывод? Тамошние спецы не имели практических навыков в создании компиляторов, а их Ассемблер - жалкое подобие на Ассемблер (ещё и под DOS). Один товарищ пытался его улучшить (особенно смешно в введении).
Россия навсегда!
Сетрификаты

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простой парсер

Сообщение arthur2 » 12.01.2011 (Ср) 17:01

uni писал(а):
Код: Выделить всё
' Элементы разбора
Public Const ЭЛЕМЕНТ_НЕИЗВЕСТЕН = 0
Public Const ЭЛЕМЕНТ_ИМЯ = 1
Public Const ЭЛЕМЕНТ_ЧИСЛО = 2
В бейсике такие вещи делаются энумами - с ними работать и проще, и понятнее.
Впрочем, энумы же есть и в других языках?
Код: Выделить всё
Enum ЭЛЕМЕНТ
ЭЛЕМЕНТ_НЕИЗВЕСТЕН = 0
ЭЛЕМЕНТ_ИМЯ
ЭЛЕМЕНТ_ЧИСЛО
ЭЛЕМЕНТ_КОНЕЦ
ЭЛЕМЕНТ_ПЛЮС
ЭЛЕМЕНТ_МИНУС
ЭЛЕМЕНТ_УМНОЖИТЬ
ЭЛЕМЕНТ_ДЕЛИТЬ
ЭЛЕМЕНТ_РАВНО
ЭЛЕМЕНТ_ЛЕВАЯСКОБКА
...
End Enum
Артур
 
   

uni
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 105
Зарегистрирован: 05.05.2006 (Пт) 15:24
Откуда: Екатеринбург

Re: Простой парсер

Сообщение uni » 12.01.2011 (Ср) 17:08

Я про enum в бейсике не знал ;) думал нету такого... будем пробовать.
Россия навсегда!
Сетрификаты

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Простой парсер

Сообщение pronto » 12.01.2011 (Ср) 17:14

А... Ты про эти идентификаторы... Писалось это очень давно и это был мой первый опыт в области разбора. Сейчас я бы многое переделал, но желания пока не позникает.
O, sancta simplicitas!

Пред.След.

Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

    TopList