Русские вычислители

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

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


Вы здесь » Русские вычислители » Словесность » "Парсер" по-русски


"Парсер" по-русски

Сообщений 1 страница 39 из 39

1

Вот мне вчера пришла классная идея написать свой "парсер". Уже начал писать код, и вот задумался, а как мне всё время называть мой "парсер", да и вообще любой "парсер". Я имею в виду само слово. Оно-то просто перенято из английской терминологии ("parser"). Если переключить на Википедии с английской статьи "Parser" на русскую версию, то я для "парсера" увижу "синтаксический анализатор". Кстати, по мне, так смешное слово этот "анализатор". Но ладно, дальше по теме. Я понимаю, что невозможно сегодня навести порядок в русских словах, так как это просто гигантский труд. Есть более приоритетные дела на данный момент. Но просто зафиксирую такую цель на будущее.  ^^

С наведением порядка в словах я имею в виду "рефaкторинг" языка в сторону перехода русских слов с нерусскими корнями на русские слова с русскими корнями. Примеров русских слов с нерусскими корнями много. Например, с французских времён пришли "пляж" (plage), "пейзаж" (paysage) и даже "буржуй" (bourgeois). Потом прибавилось много немецких корней, типа "бухгалтер" (Buchhalter), "бутерброд" (Butterbrot) (кстати, ел сегодня очень вкусный бутерброд с маслом, с сыром и с лососю, всем рекомендую) или "шлагбаум" (Schlagbaum). И вот сегодня дожили и до прихода английских корней, типа "саит" (site), "лидер" (leader) и "интервью" (interview). Переводы, я думаю, не нужно приводить, все слова понятны. И, собственно, вот сегодня дошел и до "парсера" и решил записать пару мыслей.

Я думаю, русский язык может перемолоть всё, что на него бросается. Не зря он синтаксический, по сравнению с всякими аналитическими и агглютинативными языками. Все эти иностранные корни потом можно гнуть, как хочешь, и в конце концов они сдаются и прогибаются под русский синтаксис. Иногда даже и наказываются, как слово "манагер". Но думаю, будет больше понятно, если использовать русский эквивалент. Например, вместо "анализ" - "разбор", вместо "директор" - "направитель" или "руководитель".  :yep:

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

И вот после такого небольшого предисловия я хотел бы найти русское слово, которое понятно выразило бы смысл слова "парсер" или "синтаксический анализатор". Я накопал, что "синтаксис" это "составление" или "что-то составное", а "анализ" это "разбор", "разложение". Как-то так. Перевёл тоже на немецкий, там у них "парсер" также можно назвать "Zerteiler" = "расчленитель".

Лично мне на данный момент как-то нравиться слово "разложитель". Он "разложит" все части грамматического предложения на его составные части, ну или выдаст ошибку, если что-то не так. Если у вас есть какие-то идеи по этому поводу (может быть, кто-то тоже уже искал такое слово), то поделитесь мыслями. Ну а пока пошел дальше писать свой "разложитель". Может быть, завтра успею закончить.  :writing:

0

2

С бутербродами хохма:
"бутерброд с маслом" = (дословно) маслохлеб с маслом.
т.е. бутер = масло с немецкого.
В разговорной речи бутерброд неправильно сокращают до "бутера" (т.е. масла) и говорят "бутер с маслом, с сыром, икрой" и т.п. :D
Правильно говорить "хлеб" со <всем перечисленным>.
с бухгалтером связано неправильное звучание - непроизносимое "х". Вообще слово неудобное и в разговорной речи это просто "бух".
Вообще с заимствованиями связаны большая часть так называемых трудностей русского языка из-за обилия исключений:
Например, в жюри ю вместо у, хотя есть же глагол журить с близким смыслом, кофе - среднего рода по образу слова.
Еще куча не склоняется (по мнению особых умников), хотя язык требует склонения всех существительных и прилагательных без исключения (в т.ч. человеческих имен и фамилий).
Без этого очевидно получается неточная передача смысла при гибком порядке слов.

Что парсер, что анализатор - это разборщик.
Словосочетанию "<существительное> парсер/анализатор" в русском языке соответствует "разбирающий <существительное>"
leader = ведущий, главный и т.п.
рефакторинг = переделка, перестройка
сайт = участок, место, расположение.
интеллигент - рассуждающий (а не понимающий)
с манагером - целая история.
Вообще у английского слова manage есть куча смыслов.
и "манагер" во всех смыслах неудачное - это может быть управляющий/заведующий/-вед. Последняя доконцовка наиболее подходящая.
Например, сравните даже частичную замену в "менеджере по работе с клиентами/персоналом/партнерами..." на "персоналовед/клиентовед/партнеровед..."
Менеджер по работе с людьми = людовед (вот самя суть:D, кстати, англ. глагол manage может переводиться и как "съедать")

0

3

Возможно наиболее точный исходный дословный смысл слова "интеллигент" - это просто "начитанный" или "набравшийся" (обычно в таких и употребляются):

Происходит от лат. intelligens (intellegens) «сведущий, понимающий», далее из intellegere (intelligere) «воспринимать, познавать; мыслить», далее из inter- «между» (из праиндоевр. *enter «между», сравн. степень от *en- «в») + legere «собирать, читать» (восходит к праиндоевр. *leg- «собирать, подбирать»).

0

4

Любопытно. Половину я не знал. Хотя тоже смотрел как на немецком.
Мне долго не удавалось написать "парсер". Пока я не прочел книжку Вирта алгоритмы+структуры=программы.
Только тогда я понял что "парсер" - это разбор. Суть парсинга разбор текста на составляющие. Также иногда говорят о парсинге файлов и протоколов. Результатом парсинга текста является дерево или любой другой набор структур.
Хочу поблагодарить за слово анализ. Теперь понятно что такое математический анализ. 

Кстати есть такое слово устройство.  Изначально имело другой смысл. И говорили устройство катушки, устройство конденсатора.  Потом устройство приемника. Понимали организацию, конструкцию конкретного предмета.  А теперь говорят устройство подразумевают техническое изделие.

Слово "разборщик" для меня звучит дико. Но я думаю со временем люди привыкнут как привыкли к слову устройство. Но пока что я вижу смысл в том что-бы создавать новые конструкции фраз. Надо почитать как делают лозунги. Что-бы сделать фразы более запоминающимися.

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

Насколько я понял это было полвека назад, а затем примерно пару десятилетий назад приняли как стандарт. С изобретением компьютера китайцем пришлось делать свой шрифт.
В то время существовали газеты, со своими шрифтами.  При разработки шрифта сделали упрощение начертания. На мой взгляд они несильно поменялись. Хотя без условно некоторые  упрощения сделали. Если сравнивать с русским языком, то по сути это как рукописный шрифт и печатный.  Разгадывать иероглифы теперь стало проще, но смысла не прибавилось.

Китайцы жалуются на то, что молодёжь не может смотреть советские фильмы с субтитрами.
Они не могут понять смысл иероглифов типа СССР или главрыба. 
Так что Китай не лучший пример.

У Японцев с этим лучше. Пару веков назад они перешли на слоговую запись. И в век компьютеров она приобрела популярность. Правда старики ворчат что молодёжь не уважает традиции писать иероглифами.

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

Поддерживаю. Но наше правительство против. Вводит второй язык.

Главное понимать, какие образы скрываются под иностранными корнями. А то многие люди, которые эти образы не имеют, потом несут какие-то заученные пустые фразы, не понимая вообще сказанного смысла.

Система антиплагиат приводит к тому, что приходиться писать аброкадабру.

0

5

Я подумал. Слово "разложитель" звучит лучше чем "разборщик".  Да и объяснить будет проще, так как разложитель раскладывает данные по переменным.

0

6

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

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

Насчёт Китая и наведения порядка в знаках и символах. Я знаю, о чём ты говоришь, Павия. Я сам немного изучал китайский язык, дошел до знания 300 слов и удалось побывать в Китае (где упрощенные иероглифы) и на Тайване (где традиционные иероглифы). Так что сам своими глазами видал разницу. Но с "наведением порядка в знаках и символах" я имел ввиду нечто другое, но к сожаление никак не вспомню, что это было и где я это видел. Но не страшно. Сами со временем поймём, где и как стоит улучшать и развивать язык. Насчёт японцев, да, у них помимо иероглифов ещё и хирагана и катакана. В общем, думаю, тоже интересно и полезно знать, как устроены разные языки и какие полезные штучки в них существуют. Кстати, кто не большущий лентяй, почитайте рассказ "Лев Успенский - Глокая Куздра", где студенты на первую лекцию по языкознанию пришли (http://www.mixei.ru/archive/index.php/t-57231.html).

Насчёт "персоналовед/клиентовед/партнеровед..." тоже неплохо. Сначала не привычно, когда прочитал, но если привыкнуть, то будет нормально. Расклад тут ещё следующий: "клиент" (латинский корень), "персонал" (латинский корень), "партнёр" (французский корень). Наверное и не страшно, что столько много иностранных корней. Очень богатый язык получается. В многих других языках (английский, немецкий, французский, ...) тоже много иностранных корней (латинские, греческие, ..?). Видимо в китайском только свои китайские корни, но точно не знаю. В общем бесконечная и очень увлекательная тема - все эти языки, включая компьютерные языки. Пока ограничусь размышлениями над "разборщик/разложитель".

Буду дальше пока трудится над "разборщиком/разложителем". Если будут ещё вопросы или просто какие-нибудь прикольненькие идеи или результаты, то напишу опять.

0

7

Вот ещё одно слово - "токен", как по-русски? Начал разбирать (анализировать) и вот что разузнал. Ссылки сейчас не буду приводить. Всю следующую информацию взял из википедии и из викисловаря. Поскольку я не учёный в области древних культур, языков и истории, я просто доверился их информации. Итак:

"токен" - от английского Token «знак, символ; опознавательный знак; жетон»). Дальше теперь зрю в корень:

"знак" - происходит от праславянского языка (от которого произошли славянские языки). Оцениваю этот корень как "хороший корень", как системообразующий корень русского языка. :yep:

"символ" - из греческого языка (σύμβολον - симболос). Не знаю как тесно связан греческий с русским языком, но кажется слово "знак" всё-же ближе. Кстати, сим-болос (то, что объединяет), диа-болос (то, что разъединяет) -> чёрт. Даже есть такая игра "Diablo".

"жетон" - из французского языка ("jeton", дальше "jet" - от латинского "iacere" = "кидать") - значок, указывающий на принадлежность к чему-либо. Вроде хорошое определение.

Так что и тут опять всё уходит глубоко в область языкознания. Всё больше понимаю теперь великого вождя всех времён и народов :crazy: с его статьёй "марксизм и вопросы языкознания", где он указывает на важность русского языка. Ладно... я думаю тут в идеале нужно придумать своё слово, типа того, как это есть для "token": "tokenization", "tokenizing", "tokenism", "tokenist", "tokenistic", ....

В таком же направлении нужно пойти и для слова "знак": "знакун", "знаковой", "знакение -> значение", "знаковать", "знакить", "знакет", "знакарь", "значёк", ... , что-нибудь такое. Один из моих любимых вариантов: "знакевина", как "дерево" -> "древесина". Что-то нужно подобрать так, чтобы вышло определение "значок, указывающий на принадлежность к чему-либо".

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

0

8

Составляя документацию на свой язык, я сделал следующее описание.

1.1 Знак и символ.
Знак это элемент таблицы кодировки(буква, цифра, '№', '!',  и т. д. ). Символ это элемент алфавита в формальной грамматике.  Говоря проще символ является синонимом лексемы.
Лексемы состоят из знаков текста. Текст может быть в кодировке ASCII(ANSI и совместимые) или UNICOD. При сравнении лексем буквы не чувствительны к регистру.
Типы символов:
- строка,
- число,
- комментарий,
- слово (обозначение или служебное слово),
- символ препинания ('<=','<>' и т. д.),
- пробельный символ,
- прочие символы.

Отредактировано Павиа (09.11.2015 20:50:31)

0

9

Павиа написал(а):

Кстати есть такое слово устройство.  Изначально имело другой смысл. И говорили устройство катушки, устройство конденсатора.  Потом устройство приемника. Понимали организацию, конструкцию конкретного предмета.  А теперь говорят устройство подразумевают техническое изделие.

Почему «имело»? До сих пор имеет. Например: этот двигатель имеет сложное устройство. И сейчас так говорят.
Вообще, если в вашей «айтишной» (читай: обезьяней) среде какое-то слово утратило какое-то значение или вообще перестало употребляться, то это не значит, что в языке остальных русских людей произошло то же самое.

0

10

Роман, в ваших писаниях очень много нерусских слов, которые можно легко заменить на русские.

0

11

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

0

12

А вот Михальнику — благодарность!

0

13

Вот словарь замен, которое ведёт сообщество, в котором я состою: https://docs.google.com/spreadsheets/d/ … tw-XORtIdk

0

14

По рассказу про Щербу.

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

Толку-то от того, что этот Щерба распознал строй предложения, смысла-то он не понял вообще!
Что важнее: понять смысл высказывания, не разобравшись в его грамматике, или расписать всю его грамматику, так и не поняв смысла?
Учитывая то, что речь нужна для передачи смысла между людьми, а не наоборот, то всё-таки важнее понимать смысл сказанного или написанного.
Этот пример тоже подтверждает первичность корнеслова языка и вторичность правил построения речи (грамматики).

0

15

1.1 Знак и символ.
Знак это элемент таблицы кодировки(буква, цифра, '№', '!',  и т. д. ). Символ это элемент алфавита в формальной грамматике.  Говоря проще символ является синонимом лексемы.
Лексемы состоят из знаков текста. Текст может быть в кодировке ASCII(ANSI и совместимые) или UNICOD. При сравнении лексем буквы не чувствительны к регистру.
Типы символов:
- строка,
- число,
- комментарий,
- слово (обозначение или служебное слово),
- символ препинания ('<=','<>' и т. д.),
- пробельный символ,
- прочие символы.

Это вносит некоторую путаницу. Например, расходиться с тем, что написано в вики:

Лексема (информатика) — последовательность допустимых символов языка программирования, имеющая смысл для транслятора.

Т.е. принимается, что символ тот же знак.
Поясню: без указания принадлежности к множеству "знак" и "символ" не различимы, но ясно, что "знак из кодировки" и "знак из формальнограмматического алфавита" - это знаки из разных множеств.
Знаки препинания называть символами вообще не принято, м.б. смущает то, что они могут состоять из более одного знака кодировки?
Так, например, ";" - это один знак препинания во многих языках и один знак в кодировке, но построен из двух графических знаков:)

В языковедении лексема по сути своей словосмысл. А если "символ" это досл. "обьединяющий", то это как раз точнее, т.к. идет речь о сочетании знаков идущих подряд (в этом смысле - лексема и лекс. анализ - сильно завышенные названия простейшей разбивки).

Мне понравился вариант "разборщик" <...>"разложитель" тоже хорош. Я думаю, нужно несколько дней теперь подумать и поспать. Может быть, возникнут какие-нибудь серьёзные контраргументы или выявится лучший кандидат из двоих. Думаю, тут трудно угадать, какое слово будет более правильным в будущем, как и любой другой прогноз. Нужно просто гигантское количество фактов, чтобы правильно выбрать.

По сути подойдут и разбивщик (-атель), и раздельщик а м.б. даже лучше выборщик, выделитель, вычленитель или проборщик. Но я не думаю, что нужно искать какую-то первозданную истину, а при равных условиях можно брать то, что короче или использовать несколько слов равноправно (последнее способствует развитию языка).
Для передачи смысла возможностей очень много. Да назови лексемы хоть зразами, зато компиль будет выдавать ошибки доходчиво :D
В конечном счете на языке прописцев остаются только сами виды (числа, строки, ....) и <не"лексема"> (что дословно - бессмыслица). Тогда можно лексему звать смЫслицей (или смыслИцей, х.з. как правильно, надо смотреть подобия) или м.б. даже осмыслицей, что свойственно русскому языку и устойчиво в нём: смыслится -> смыслица.

0

16

Это вносит некоторую путаницу. Например, расходиться с тем, что написано в вики:

Это ошибка в википедии. Намешаны в кучу определения из языковедения и формальных языков.  В результате получилась путаница.
Знак и символ я разделил намеренно. Так как у новичков часто возникает путаница и они неправильно понимают формальную грамматику.

Знаки препинания называть символами вообще не принято, м.б. смущает то, что они могут состоять из более одного знака кодировки?

Это моё изобретение. Честно подтолкнул MSDN.

Из моего языка.

1.6 Знак препинания
Символ препинания состоит из одного или нескольких знаков препинания. Знаки препинания один из списка  ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ ` { | } ~
Символы препинания:
'<=', '>=', '=', '<>',  ':=', '+', '-', '*', '/', '<', '>', '@', '^', '(', ’)’, ‘.’, ‘..’, ’,’ , ‘[’,  ‘]’

Странно, что не в одной книге это не написано.  Что-бы не в даваться в подробности теорию скажу, что это удобно!
Я выше привел 7 разновидностей символов!  Из них можно составить любой язык. Думаю, что при обучении созданию компиляторов в части формальной грамматик надо использовать их.

Отредактировано Павиа (14.11.2015 17:12:18)

0

17

Это ошибка в википедии. Намешаны в кучу определения из языковедения и формальных языков.  В результате получилась путаница.

В книгах тоже чаще символы вместо знаков. Поэтому путаница только растет. Лучше его, "символ" вообще не использовать.

Это слово по сути в описании Вам и не требуется, будет проще:

1.6 Препинания
Состоят из одного или нескольких знаков из ряда:  ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ ` { | } ~
Допустимые препинания:
'<=', '>=', '=', '<>',  ':=', '+', '-', '*', '/', '<', '>', '@', '^', '(', ’)’, ‘.’, ‘..’, ’,’ , ‘[’,  ‘]’

Или даже так:

1.6 Препинания
Один или несколько знаков из ряда:  ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ ` { | } ~
Допустимые препинания:
'<=', '>=', '=', '<>',  ':=', '+', '-', '*', '/', '<', '>', '@', '^', '(', ’)’, ‘.’, ‘..’, ’,’ , ‘[’,  ‘]’

Так как у новичков часто возникает путаница и они неправильно понимают формальную грамматику.

Потому что в описании использованы всякие заумные словосочения вроде "терминального символа/знака" вместо окончания.

0

18

Павиа написал(а):

Это моё изобретение.

Не тянет это на изобретение. Изобретение — это обретение чего-либо нового.
Но что обретёт русский язык с вашими «символами препинания»?
Только одно — ещё больше нерусскости, ещё меньше русскости.

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

0

19

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

Потому что в описании использованы всякие заумные словосочения вроде "терминального символа/знака" вместо окончания.

О, да. Меня это в своё время сбивало с толку.
Причём я нигде не видел объяснения слова «терминальный».
Как-будто я обязан знать эту давно почившую латынь.

0

20

MihalNik1 Вы всё правильно пишете. Но акценты расставляет автор.

Сергей написал(а):

Не тянет это на изобретение. Изобретение — это обретение чего-либо нового.Но что обретёт русский язык с вашими «символами препинания»?Только одно — ещё больше нерусскости, ещё меньше русскости.

Это у вас уже шарики за ролики заходят. Оба слова русских! Слово символ уже применяется в таком понятие в формальной грамматике. Просто решил описать это более наглядно, и как видно преуспел.  Во-вторых изобретение относится к формальным грамматикам, а не к русскому языку. Составлен законченный ряд возможных видов лексем.
Слово символ там лишнее с этим согласен. Но с другой стороны своего эффекта я добился. Может через-чур, но за неимением другие способы передать свою мысль оставил этот вариант. Пока это только эскиз. Надеюсь в будущем найду другой способ выразить свою мысль в другой форме, которая всех устроит. 

Сергей написал(а):

Как-будто я обязан знать эту давно почившую латынь.

В этом плане мне нравятся немецкие авторы. Первые главы описывают основные понятия. А в конце ещё и справочный материал. А после того как я прочёл книгу Вирта, теперь советую именно его вместо книги дракона.

0

21

Павиа написал(а):

Оба слова русских!

Нет, лишь одно.
Слово «символ» не русское, да и не может им быть.
В русском слове русские корни. Где вы их здесь видите?

0

22

Здесь и вижу. "символ" - это и есть корень.

0

23

Павиа написал(а):

Здесь и вижу. "символ" - это и есть корень.

Где именно вы здесь видите русский корень?

0

24

Сергей написал(а):

...в вашей «айтишной» (читай: обезьяней) среде...

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

Для "токен" я всё же выбрал просто слово "значок". И разложитель раскладывает текст на значки.

Ещё хотел коротко поделиться продвижением с разложителем. Теория оказалась очень простой. Главное правильно выстроить конечный автомат. Я себе на примере разложения математического выражения, типа "5+2*(3 + 15)", нарисовал себе вот такую картинку:
http://s3.uploads.ru/dS4t7.jpg
На рисунке (Н) это "начало", (К) это "конец", "CE" это рекурсивный спуск в себя-же, туже самую картинку. Если в тексте (начиная с Н) встречаются значки в последовательности, по которой идут стрелочки, то текст составлен правильно и без ошибок. Если идя по тексту встречается значок, который не ожидается по стрелочке, то это ошибка. Всё отлично работает, даже для более сложных примеров.

Вот ещё код, если кому-нибудь интересно проверить:  :writing:

код
Код:
#include <stdio.h>
#include <stdlib.h>

#define TOKENTYPE_END 0
#define TOKENTYPE_NUMBER 1
#define TOKENTYPE_PLUS 2
#define TOKENTYPE_MINUS 3
#define TOKENTYPE_MULTIPLY 4
#define TOKENTYPE_DIVIDE 5
#define TOKENTYPE_LEFTBRACKET 6
#define TOKENTYPE_RIGHTBRACKET 7
#define TOKENTYPE_UNEXPECTED 8

struct Token
{
	int Offset;
	int Length;
	int Type;
};

void AddToken(struct Token* tokens, int *count, int offset, int length, int type)
{
	tokens[*count].Offset = offset;
	tokens[*count].Length = length;
	tokens[*count].Type = type;

	(*count)++;
}

void PrintTokens(const struct Token* tokens, const char* str)
{
	int i;
	for (i = 0; tokens[i].Type != TOKENTYPE_END; i++)
	{
    printf("%.*s\n", tokens[i].Length, &str[tokens[i].Offset]);
	}
}

// пройтись по стрелочкам
int CE(struct Token* tokens, int i)
{
	if (tokens[i].Type == TOKENTYPE_NUMBER)
	{
    i++;
    goto next;
	}

	if (tokens[i].Type == TOKENTYPE_LEFTBRACKET)
	{
    i++;
    i = CE(tokens, i);

    if (tokens[i].Type == TOKENTYPE_RIGHTBRACKET)
    {
    	i++;
    	goto next;
    }
	}

	tokens[i].Type = TOKENTYPE_UNEXPECTED;
	return i;

next:
	if (tokens[i].Type == TOKENTYPE_PLUS ||
    tokens[i].Type == TOKENTYPE_MINUS ||
    tokens[i].Type == TOKENTYPE_MULTIPLY ||
    tokens[i].Type == TOKENTYPE_DIVIDE)
	{
    i++;
    return CE(tokens, i);
	}

	return i;
}

// разложить текст на значки и проверить по стрелочкам
void Parse(const char *str)
{
	struct Token* tokens = (struct Token*)malloc(sizeof(struct Token) * 100);
	int count = 0;
	int i = 0;


	while (1)
	{
    int s = i;
    
    // пробел
    while (str[i] == ' ' || str[i] == '\t')	i++;
    if (i > s)
    	continue;

    // число
    while (str[i] >= '0' && str[i] <= '9') i++;
    if (i > s)
    {
    	AddToken(tokens, &count, s, i-s, TOKENTYPE_NUMBER);
    	continue;
    }

    // значки
    if (str[i] == '+')
    {
    	i++;
    	AddToken(tokens, &count, s, i-s, TOKENTYPE_PLUS);
    	continue;
    }

    if (str[i] == '-')
    {
    	i++;
    	AddToken(tokens, &count, s, i-s, TOKENTYPE_MINUS);
    	continue;
    }

    if (str[i] == '*')
    {
    	i++;
    	AddToken(tokens, &count, s, i-s, TOKENTYPE_MULTIPLY);
    	continue;
    }

    if (str[i] == '/')
    {
    	i++;
    	AddToken(tokens, &count, s, i-s, TOKENTYPE_DIVIDE);
    	continue;
    }

    if (str[i] == '(')
    {
    	i++;
    	AddToken(tokens, &count, s, i-s, TOKENTYPE_LEFTBRACKET);
    	continue;
    }

    if (str[i] == ')')
    {
    	i++;
    	AddToken(tokens, &count, s, i-s, TOKENTYPE_RIGHTBRACKET);
    	continue;
    }

    // конец
    if (str[i] == '\0')
    {
    	i++;
    	AddToken(tokens, &count, s, i-s, TOKENTYPE_END);
    	break;
    }

    printf("Unexpected character '%c' at position %d.\n", str[i], i);
    goto finish;
	}

	PrintTokens(tokens, str);

	i = CE(tokens, 0);

	if (tokens[i].Type != TOKENTYPE_END)
    printf("Unexpected token '%.*s' at position %d.\n",
    	tokens[i].Length, &str[tokens[i].Offset], tokens[i].Offset);
	else
    puts("Successful.");

finish:
	free(tokens);
}

int main()
{
	char str[1024];

	while (1)
	{
    gets(str);

    if (str[0] == '\0')
    	break;

    Parse(str);
	}

	return 0;
}

Я пишу вообще-то в C#, но переделал пример в C, так как C легче скомпилировать и запустить (не нужно VisualStudio), если кто-то хочет проверить.

0

25

Унарные операторы не учитываются. Приоритеты операторов тоже не учитываются.
Что вычислит ваша программа при вводе 2+2*2=?

Во-вторых хотелось бы увидеть именно разбор выражений. А не так как сейчас. Разобрать текст программы это значит построить дерево программы. А не разбить на знаки и символы.

0

26

Эти унарные операторы?

Ну, речь идёт о "разложителе/парсере". Из википедии: "Каждый транслятор (компилятор или интерпретатор) имеет встроенный парсер. Парсер выполняет преобразование текста, записанного на каком-либо языке программирования во внутреннее представление, удобное для дальнейшей работы транслятора.". Транслятором я займусь позже. Сейчас моя программа просто анализирует, правильно ли введён текст. Для примера я ограничился значками 'число', '+', '-', '*', '/', '(' и ')', чтобы проверить теорию, которую мне было интересно самому построить и понять. Теперь я знаю, что то, что я наработал, называется методом рекурсивного спуска и этой наработкой я очень доволен.  :cool:

То есть, в мою программу (код которой я привёл выше) можно вводить только математические выражения как "5+2*(3 + 15)" или "(13)-((2+4)*2)" или "2+2*2", но не "2++7)(6" - это явно не соответствует грамматике. Все значки в программе лежат просто в массиве. Забегая вперёд скажу, что для построения дерева нужно просто заменить массив на двусвязный список и без затруднений можно заменять выражения, как "число * число" или "(число)", на новый значок, которое кстати тоже "число". И так всё заменять, пока не останется только одно число. В итоге, готов простой калькулятор. Опять повторюсь, теория оказалась сверх простой. И я поделился моими наработками, чтобы наша общая "копилка знаний" на этой странице для построения своего языка программирования пополнилась. Ну а там уже каждый может делать, что хочет.  :glasses:

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

Ещё замечу, что у нас тут возможно разные цели по умолчанию. Я на данном этапе не хочу создать русский язык программирования, чтобы с ним создавать программы для x86 или x64 или ARM, поэтому и не буду сейчас спешить и встраивать все унарные операторы и другие штучки, чтобы получить полноценную копию C++. Если уж к этому пришло, то я считаю, что нужно создавать код для некой своей виртуальной промежуточной архитектуры, типа LLVM или Java или C#. А с ней потом дальше работать.  :yep:

0

27

Павиа написал(а):

Что вычислит ваша программа при вводе 2+2*2=?

Да, забыл ответить. Если бы Вы посмотрели на картинку выше, то увидели бы, что там нет значка "=". То есть, такой ввод является не правильным для данной программы.

0

28

Эх, Рома! Я в компиляторо строение более 10 лет. За это время попробовал все подходы.

Парсер выполняет преобразование текста, записанного на каком-либо языке программирования во внутреннее представление, удобное для дальнейшей работы транслятора."

Так вот это вода. Фраза допустима когда мы не знаем разложитель: "чего ?", мы делаем. А вот когда знаем тогда можно и назвать внутреннюю структуру. И во всех книжках по компиляторам это дерево.

Опять повторюсь, теория оказалась сверх простой.

Просто вы её не поняли.  Теория и правда простая. Но не сверх простая.
Для правильного разбора формул вам многое ещё нужно сделать. А для разбора нормального языка ещё больше.
Посмотрите BISON и YACC там операторы делятся не только по приоритетам, но на правые и левые.
Ваш калькулятор не поддерживает многое:
"(13)" - правильное выражение
"(-13)" - не правильное выражение!
"2+2*2" у вас будет 8, а правильно 6.
Как известно в компьютере от перестановки слагаемых сума меняется!
Примеры
1)
i=i++ + ++i;
i=++i + i++;
2)
Второе это то что после каждой операции происходит округление чисел. Поэтому точность теряется.
А да проблема от перестановки слагаемых сумма меняется. Сразу успокою в большинстве случаев не критично.
Можете заглянуть сюда и убедится. Да нужна регистрация.
http://www.intuit.ru/department/superco ... seraspp/2/
примерно на 54 минуте можно посмотреть как виду числа с плавающей точкой при сложение в разном порядке(задача про крокодила).
и тд.

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

0

29

Фраза допустима когда мы не знаем разложитель: "чего ?", мы делаем. А вот когда знаем тогда можно и назвать внутреннюю структуру. И во всех книжках по компиляторам это дерево.

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

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

И во всех книжках по компиляторам это дерево.

Так что, это не означает, что дерево это единственный истинный путь. Дерево пригодиться когда сложность будет расти. Пока всё просто, удобней работать с очередью.

Просто вы её не поняли.

Вы видимо не увидели ссылку. Вот ещё раз приведу её: ссылка.

Для правильного разбора формул вам многое ещё нужно сделать. А для разбора нормального языка ещё больше.
Посмотрите BISON и YACC там операторы делятся не только по приоритетам, но на правые и левые.
Ваш калькулятор не поддерживает многое:
"(13)" - правильное выражение
"(-13)" - не правильное выражение!
"2+2*2" у вас будет 8, а правильно 6.
Как известно в компьютере от перестановки слагаемых сума меняется!

У меня уже всё есть для правильного разбора формулы. Не знаю, зачем мне нужно ещё тратить много времени и смотреть ролики и BISON и YACC.
"(13)" - правильно, да. "(-13)" - не правильно, да. Но опять же, я привёл пример на картинке. Эту фундаментальную структуру рекурсивного спуска нужно просто дополнить.
Насчёт "2+2*2", я уже писал:
"для построения дерева нужно просто заменить массив на двусвязный список и без затруднений можно заменять выражения, как "число * число" или "(число)", на новый значок, которое кстати тоже "число". И так всё заменять, пока не останется только одно число.". Порядок заменений "2*2" или "2+2" зависит только от того, какое заменение в очереде значков я выполню первым. Понятно, что умножения я заменю первым, а сложение потом.

Я в компиляторо строение более 10 лет. За это время попробовал все подходы.

Вот это действительно очень удивительно, Павия! Попробовали все подходы, в компиляторо-строении более 10 лет, читаете книги, а складывается впечатление, что Ваш уровень знания и понимания в этой тематике какой-то никакой. Может быть Вы просто умничаете, ну или это просто из серии "смотрю в книгу, вижу фигу". К тому же вы мыслите по авторитетам - "правильно только то, что написано в святых книжках или сказано какими-то авторитетами.". Слабо всё самому уверенно знать и понимать? Строя из себя авторитета с высказыванием "Я в копиляторо строение более 10 лет" Вы заслужили в связи с Вашими последними изложениями не уважение, а насмешку, честное слово.

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

0

30

Эх! :D

0

31

Роман написал(а):

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

А что тут кто-то, ссорится? Да, тут кроме вас таких нету.  :D

Роман написал(а):

Вот это действительно очень удивительно, Павия! Попробовали все подходы, в компиляторо-строении более 10 лет, читаете книги, а складывается впечатление, что Ваш уровень знания и понимания в этой тематике какой-то никакой. Может быть Вы просто умничаете, ну или это просто из серии "смотрю в книгу, вижу фигу". К тому же вы мыслите по авторитетам - "правильно только то, что написано в святых книжках или сказано какими-то авторитетами.". Слабо всё самому уверенно знать и понимать? Строя из себя авторитета с высказыванием "Я в копиляторо строение более 10 лет" Вы заслужили в связи с Вашими последними изложениями не уважение, а насмешку, честное слово.

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

У меня уже всё есть для правильного разбора формулы. Не знаю, зачем мне нужно ещё тратить много времени и смотреть ролики и BISON и YACC.

правильный разбор это тот, который соответствует общим правилам. А в общих правилах у выражения есть приоритеты, а у вас их нет. И это факт. А вы тут пытаетесь доказать обратное.
Во-вторых. Разбор формулы это примитив который любой нормальный программист изучивший рекурсию напишет сам. Что я собственно без всяких теорий и проделал за один вечер. А вы за 15 дней так и не смогли этого сделать, а уверяете что всё есть.
В-третьих не хотите читать теорию, так и не читайте набивайте шишки сами. Я вас что заставляю? Или вам правда глаза колит?

что внутренняя структура это то, что в википедии называется "очередь классифицированных лексем."

Я вас умоляю, не читайте больше wiki'дряни. Wiki'педия это источник в котором полно ошибок и не доделок. В английской википедии следят за частотой и обязывают профессоров писать туда. А у нас одна дрянь.
Чем очередь лексем отличается, от очереди классифицированных лексем? А где у вас классы? Да нету их у вас, у вас только имена лексемам даны. Отсюда вывод, у вас только очередь лексем. А я ведь выше вам выше уже написал какие классы(виды) можно ввести.

Но опять же, я привёл пример на картинке. Эту фундаментальную структуру рекурсивного спуска нужно просто дополнить.

:cool: Да вы ничего не поняли. И составили кашу из слов. На картинке у вас граф переходов. Где здесь спуск?  То что ваш примитив нужно дополнить это и первокласснику понятно. Если к 1 прибавить 1 мы получим 2. Если к 2 прибавить 1 мы получим тройку и так можно досчитать до сколь угодно большого числа. Тут вы применили некогда приобретённый опыт, на эту задачу.  Вы просто думаете что всё поняли! Но это не так.  Вы ведь не знаете, что нужно добавить чтобы получить разборщик Джавы или Си. 
А я знаю. Но стоит ли вам рассказывать!

Слабо всё самому уверенно знать и понимать?

  Не слабо. Я же вам сказал что сам всё попробовал. А по пробовал я не от хорошей жизни, а от того что нормальных учебников не было. А вот у вас явно детские фантазии всё делать самому. Ведь тот кто стоит на плечах других видит дальше всех. Так и в науки кто изучил достижения других может открывать что-то новое, а не изобретать очередной велосипед.

Отредактировано Павиа (23.11.2015 23:10:36)

0

32

Вот и размежевались.  :crazy:  Теперь можно с новыми силами трудиться ещё лучше!  :yep:

0

33

Павиа написал(а):

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

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

0

34

Роман написал(а):

Сергей, почему "обезьяней"?

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

0

35

Сергей, многие действительно такие "животные". Но этот вопрос был уже во все времена и в любом социуме (поселение, страна, цивилизация, ...) - Как пасти "стадо" так, чтобы оно по своей же глупости не убило себя же и всех других, которые живут в этом "стаде"? И эта проблема будет ещё всегда присутствовать в будущем, потому что время идёт и новые глупые люди рождаются и поумневшие умирают. Бесконечный процесс. Поэтому всегда все революции опираются на "ещё глупую" молодёжь, которая ничего своего создавать не хочет, а просто следует животным инстинктам "дайте больше и быстрей, и чтоб как-можно меньше работать для этого нужно". Вот везде и внедрили слово "благополучие", вместо слова "благодатие". Но есть и много нормальных ребят.  :yep:

Так что такая тема "социо-гуманитарные технологии" тоже могла бы стать темой для русских вычислителей. А в общем, думаю, не стоит тратить много времени и нервов на возмущения о поклонниках Запада. Обсуждая их и всякие новости с ними, не остаётся времени на создание полезных вещей, которые уже сами потом сформируют новости, привлекут разные обсуждения и принесут пользу социуму.

Так что давайте более сконцентрировано работать на этом форуме над полезными проектами и создавать результаты, и таким образом будем повышать самодостаточность и понижать зависимость.  :cool:

Отредактировано Роман (29.11.2015 23:19:14)

0

36

Сергей написал(а):

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

Развитие мышления останавливается при заучивании, а при изучении развивается. (Корни у этих слов разные и приставки тоже.)
Изучать можно по разному. Можно просто читать и запоминать, а можно вдумываться в фразы.

При изучении есть следующие методы:
1) Метод научного тыка.
2) Обобщение существующих знаний.
3) Разложение знаний по полочкам.
4) Доказательство: по аналогии, сведению к ранее доказанному.
5) Инверсия к существующему подходу.
6) От простого к сложному.
и т. д.

Так вот придумать что-то новое без заучивания старого можно только случайным образом, а это пункт 1. Таких людей зовут фантазёрами, или генераторами идей. В Японии для этого просто комбинируют существующие данные, знания. А вот гении это 99% труда и 1 процент таланта. Так вот талант заключается в том, что они могут по кругу применять выше перечисленные методы.

0

37

Павиа написал(а):

Корни у этих слов разные и приставки тоже

Корни у этих слов одинаковые.

Павиа написал(а):

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

Нет, закономерным. Просто берёте и думаете.

Павиа написал(а):

Таких людей зовут фантазёрами, или генераторами идей.

Именно такие люди и делают прорывные изобретения.

Вы пишете о совсем других вещах. Жаль, что вы не поняли того, о чём я написал.

0

38

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

0

39

Павиа написал(а):

У Японцев с этим лучше. Пару веков назад они перешли на слоговую запись. И в век компьютеров она приобрела популярность. Правда старики ворчат что молодёжь не уважает традиции писать иероглифами.

Склонен с вами не согласиться, какую конкретно слоговую запись вы имели ввиду?
Вероятно вы имели ввиду романдзи (транслитерация японского языка латинскими буквами), т.к. пару веков назад японцы добавили именно ее. Но именно добавили, а не перешли.
Для японца в подобных вопросах, как я полагаю, даже сама мысль "перейти, а не добавить" покажется абсурдной:
- Как это так перейти?! Можно же просто добавить!

В современном японском языке используется три основных системы письма: кандзи — иероглифы китайского происхождения и две слоговые азбуки, созданные в Японии: хирагана и катакана. В самой Японии эта система традиционно называется «смешанное письмо иероглифами и каной» (яп. 漢字仮名交じり文 кандзи кана мадзирибун).
Часто в японском тексте встречаются латинские буквы, используемые для записи распространённых аббревиатур (например, DVD или NATO) и других целей. Транслитерация японского языка латинскими буквами называется ромадзи и встречается в японских текстах редко. Для записи числительных часто используются арабские цифры (обычно в текстах с горизонтальным направлением письма). Исключение какого-либо из перечисленных видов письма или замена одного другим в их принятом употреблении делает текст трудно читаемым или непонятным вовсе (это, пожалуй, не относится к латинским буквам, роль и употребление которых в настоящее время значительно меньше в сравнении с тремя основными системами).

Источник: https://ru.wikipedia.org/wiki/%D0%AF%D0%BF%D0%BE%D0%BD%D1%81%D0%BA%D0%B0%D1%8F_%D0%BF%D0%B8%D1%81%D1%8C%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C

0

Быстрый ответ

Напишите ваше сообщение и нажмите «Отправить»



Вы здесь » Русские вычислители » Словесность » "Парсер" по-русски