|
0 / 2 / 3
Регистрация: 29.01.2017
Сообщений: 83
|
|||||||||||
Свой компилятор: а правильно ли я разместил наборы токенов?02.11.2017, 22:52. Показов 1463. Ответов 14
Продолжаю тему пустого трепа и размышлений о том "как лучше и приятнее" сделать некоторые фичи компилятора на коленках.
На этот раз оглянулся назад к лексическому анализатору, замечу сразу, он работает сносно, мне нравится =) Если конкретнее, то вопрос касается не самого анализатора, а набора токенов, которые он ищет. Так как я работаю в ООП парадигме, с самого начала решено было инкапсулировать всё что связано с лексикой в класс Lexer. Куда всё жёстче стало когда я закончил работу. Вышло так, что внутри Lexer'а у меня появился нехилый набор констант-токенов (в виде enum)
1. Вынести эти константы куда нибудь ещё - пространство имён там, или ещё один класс, а в Lexer'е и синтаксическом анализаторе просто подключать это пространство с помощью using 2. Плевать на всё, ничего не менять, а просто использовать Lexer как неймспейс, юзать его (жестоко, но сработает же )3. Не делать ничего, ибо хардкор он для крутых Конечно, это не срочно, не принципиально, но я ведь думаю об этом, да и вопрос довольно интересный, в архитектурном плане, так что вот P.S. Лексер у меня ещё с универских лаб, которые я потихоньку доделываю сейчас, тогда меня заставили использовать раздельные наборы для разных типов лексем, а при получении токена брать две константы вместо одной (типа парами - ONE_LIT_DELIM, PLUS - вот так). Причём на множественные вопросы "для чего" ответа не было. Ну надо, значит надо, сделал, а зачем, до сих пор не знаю, мб кто знает...
0
|
|||||||||||
| 02.11.2017, 22:52 | |
|
Ответы с готовыми решениями:
14
Свой компилятор C++ Eclipse + свой компилятор. Как? |
|
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
|
|
| 02.11.2017, 23:02 | |
|
DrankUser, Ну а стандарт вам не подсказчик ?
ISO 14882:2003 2.4 preprocessing-token: header-name identifier pp-number character-literal string-literal preprocessing-op-or-punc each non-white-space character that cannot be one of the above ISO 14882:2003 2.6 token: identifier keyword literal operator punctuator Там же и фазы трансляции расписаны чтоб голова не пухла от обилия задач.
0
|
|
|
0 / 2 / 3
Регистрация: 29.01.2017
Сообщений: 83
|
|
| 02.11.2017, 23:26 [ТС] | |
|
Pechkin80, я туплю что-то
Что за стандарт? Си++? Окей, но набор токенов я уже завершил, а если надо будет ещё добавить, то дело нескольких секунд Сам по себе вопрос темы немного в другом, или я не вкуриваю смысла вами сказанного...
0
|
|
|
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
|
|
| 02.11.2017, 23:39 | |
|
DrankUser, Вы компилятор по си++ пишите ? для языка программирования c++ существует международный стандарт. Он имеет разные версии, в зависимости от года выпуска стандарта: c++98(ISO 14882:1998), c++03(ISO 14882:2003), c++11(ISO 14882:2011), c++14(ISO 14882:2014), c++17(пока не опубликован). Я рекомендую использовать версию 2003 года так как она не такая огромная.
Добавлено через 4 минуты Стандарт это нормативный документ, где формально изложено само описание языка. Другие источники, включая книжку Страуструпа это неофициально всё. Стандарт даёт хорошее преставление о структуре грамматики языка и о многом другом.
0
|
|
|
0 / 2 / 3
Регистрация: 29.01.2017
Сообщений: 83
|
|
| 02.11.2017, 23:41 [ТС] | |
|
Pechkin80, странно, но я нигде не писал о c++, я просто пишу что-то своё, ограниченное лишь моей фантазией, и небольшим ТЗ из универа, которое я постоянно нарушаю, насколько это возможно, ибо так хочу
0
|
|
|
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
|
|
| 02.11.2017, 23:43 | |
|
DrankUser, Ну даже если итак, то чтение первых трёх глав даст хорошую пищу как двигаться дальше.
0
|
|
|
0 / 2 / 3
Регистрация: 29.01.2017
Сообщений: 83
|
|
| 02.11.2017, 23:46 [ТС] | |
|
Pechkin80, о чём вообще идёт речь?
Вопрос мой о размещении набора констант в структуре проекта, причём тут вообще с++, его стандарты и движение дальше. Конечно, за заметку спасибо, я подумаю над этим, но в данной теме это немного оффтоп
0
|
|
|
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
|
||
| 03.11.2017, 09:28 | ||
|
0
|
||
|
0 / 2 / 3
Регистрация: 29.01.2017
Сообщений: 83
|
|
| 03.11.2017, 10:05 [ТС] | |
|
woldemas, ну наконец-то хоть что-то по теме
Да, как вариант можно этот набор выложить в отдельный класс... Так, сейчас я кстати ещё немного подумал о таблицах неконстантных токенов, можно сделать отдельный класс для них, и на его объект ссылаться во всех анализах, это как вариант
0
|
|
|
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
|
|||||||
| 03.11.2017, 10:27 | |||||||
|
Кликните здесь для просмотра всего текста
Я когда-то писал что-то подобное, но там был не язык программирования, а язык описания данных, с довольно сложной грамматикой и синтаксическими конструкциями.
0
|
|||||||
|
0 / 2 / 3
Регистрация: 29.01.2017
Сообщений: 83
|
|
| 03.11.2017, 10:41 [ТС] | |
|
woldemas, аа, я вижу
На самом деле когда я только взялся за лексер, у меня тоже были такие мысли, но на деле оказалось что создавать классы для токенов мне не надо, так как то что я показал вверху - это просто числовые константы, а класс для хранения одной константы звучит как-то бесполезно. Вместо этого я сделал структуру Token, которая хранит в себе целочисленную пару тип-id для поиска нужной лексемы среди вышеуказанных енамов. Причём раньше у меня был всего один enum для всех констант, а потому даже надобность в паре отсутствовала, но увы, сейчас, по велению преподавательского состава, у меня несколько енамов. А проблема сейчас лишь только в неудобстве размещения этих енамов, так как классов, работающих с ними много. Сейчас я уже подумываю просто обернуть весь компилятор в неймспейс и сделать эти константы глобальными в этой области Добавлено через 2 минуты woldemas, хотя сейчас я перечитал ваш код, пораскинул мозгами, и понял, что это выглядит круто Прикрутить к своему проекту я уже не смогу, так как это куча работы по рефакторингу, времени нет Но вот в будущем может быть попробую поработать над такой структурой
0
|
|
|
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
|
|
| 03.11.2017, 10:52 | |
|
enum лучше вообще не использовать. Граматику лучше задавать текстовым файлом в виде формул бекуса нуара. Тогда после парсинга можно получить структуру что во что вложено.
0
|
|
|
0 / 2 / 3
Регистрация: 29.01.2017
Сообщений: 83
|
|
| 03.11.2017, 13:18 [ТС] | |
|
Pechkin80, отлично, прямо сейчас я брошу всё что сделал, и вместо того чтоб добиться хоть какого-то результата начну опять полгода рыться в книжках и читать про парсинг грамматик
Понимаете, я не то что бы считаю себя выше этого, нет, напротив, я думал об этом, но всё же более целесообразным считаю доделать хотя бы этот маленький проект. Плюс, вопрос тут вообще не в том, что лучше - enum, просто массив, или же структура ООП. Вопрос в том, как это всё обернуть для более удобного и рационального задания области видимости
0
|
|
|
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
|
|
| 03.11.2017, 14:17 | |
|
DrankUser, Всё уже украдено до вас. Никакие полгода не нужно. Если лень делать парсер формул б.с., то берёте готовую библиотеку xml парсинга (в кьюте например или libxml) приспосабливаете формат под свои нужды, за пару часов это делается. Я вам как раз и подсказываю как время сэкономить. Задавать все правила в коде постоянно это вы утоните в нём))) Для правил разрешения имён тоже лучше чтото скриптовое иметь.
Добавлено через 1 минуту И я вам настоятельно рекомендую почитать стандарт. Как в нём реализовано то что вы хотите сделать, тоже разрешение имён.
1
|
|
| 03.11.2017, 14:17 | |
|
Помогаю со студенческими работами здесь
15
Свой компилятор: обработка ошибок Написал свой синтаксический анализатор+компилятор выражений Нужен компилятор с возможностью установить свой значок и изменить информацию разместил в слоях div Компилятор не хочит выполнять свою работу правильно Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|