Модераторы: Snowy, Poseidon

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Разработка компилятора языка C 
V
    Опции темы
TheVoid
Дата 27.6.2009, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Предлагаю всем желающим совместную разработку компилятора языка C (ANSI) в целях самообразования и (или) практической выгоды (на поздних этапах).
У меня нет абсолютно никакого опыта совместных проектов, потому с удовольствием попрактикуюсь smile

Во-первых, разработка будет открытой и все исходники будут размещаться на каком-нибудь Google-Code.
Во-вторых, я не знаю, каким образом происходит обсуждение проекта среди его участников, так что подскажите на этот счет smile
Цель - написать (в идеале) полноценный компилятор языка Си, или некоторое его (по возможности наиболее полное) подмножество. Переднего и заднего плана (front-end, back-end).

Высказывайтесь. Очередная банальность и велосипед о трех колесах.

Это сообщение отредактировал(а) TheVoid - 27.6.2009, 00:39
PM   Вверх
Mazzi
Дата 30.6.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 1
Всего: 21



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

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


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
DEADHUNT
Дата 30.6.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



ассемблер знаешь? если нет то тебе там делать нечего. а почему ANSI, а не C99?

Это сообщение отредактировал(а) DEADHUNT - 30.6.2009, 11:28
PM MAIL   Вверх
TheVoid
Дата 30.6.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Цитата(Mazzi @  30.6.2009,  10:20 Найти цитируемый пост)
Если нет опыта проектов, то задача великовата для тебя

Нет, речь шла о совместных проектах.
Не спрашивал даже "а как же мне написать свой язык программирования". Опыт программирования имеется, чтобы не задавать таких вопросов.



Цитата(DEADHUNT @  30.6.2009,  11:23 Найти цитируемый пост)
ассемблер знаешь? если нет то тебе там делать нечего.

Знание маш. кодов потребуется на поздних этапах компиляции - непосредственно, генерации кода. Чтобы не ударить лицом в грязь, изучаю книгу тов-ща Кипа Ирвина "Язык ассемблера для процессоров Интел".


Цитата(DEADHUNT @  30.6.2009,  11:23 Найти цитируемый пост)
а почему ANSI, а не C99?

Личные предпочтения.
PM   Вверх
DEADHUNT
Дата 30.6.2009, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  30.6.2009,  20:33 Найти цитируемый пост)
Знание маш. кодов потребуется на поздних этапах компиляции - непосредственно, генерации кода. Чтобы не ударить лицом в грязь, изучаю книгу тов-ща Кипа Ирвина "Язык ассемблера для процессоров Интел".

без вывода ассемблерного листинга сложно увидить работу компилятора. да и в чём будет заключаться его работа(на начальных этапах)? сказать - ошибок нет.

Это сообщение отредактировал(а) DEADHUNT - 30.6.2009, 22:01
PM MAIL   Вверх
TheVoid
Дата 30.6.2009, 22:23 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Начальный этап: препроцессирование, разбивка на токены, заполнение таблицы символов. Выходные данные: деревья или "четверки". Уже потом, оптимизация и, непосредственно, код.

Это сообщение отредактировал(а) TheVoid - 30.6.2009, 22:25
PM   Вверх
TheVoid
Дата 9.7.2009, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Завел собственный Блог, где буду делиться подробностями реализации компилятора. Комментарии приветствуются.
Надеюсь, кто-нибудь проявит интерес и отпишется...

Это сообщение отредактировал(а) TheVoid - 10.7.2009, 23:16
PM   Вверх
DEADHUNT
Дата 12.7.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата
Ключевые слова:
char, int, short, void, unsigned, signed, return, if, else

хорошо что всё такие есть люди которым интересно разрабатывать компилятор. похоже ты действительно ничего не понимаешь в построении компиляторов, поскольку сложность утверждений if, while, for практически одинаковая. а если думаешь потом писать компилятор C++ то в первую очередь задумайся о сканере, что бы решать разные не однозначности.

Это сообщение отредактировал(а) DEADHUNT - 12.7.2009, 17:14
PM MAIL   Вверх
Shitbox2
Дата 12.7.2009, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.7.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Дополню.
Лучше начни писать не компилятор, а визуальную надстройку на компилятор. Для начала, чтобы логические блоки (if, for ...) были ограничены разноцветными областями.

Навыки программирования графики и особенно таких компиляторов в скором времени будут сильно востребованы.
PM MAIL   Вверх
DEADHUNT
Дата 12.7.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата

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

Пример: void ScanSkipMultiLineComment(void) .

И поэтому мне очень не нравится использовать стандартные библиотечные функции – они ломают всю картину. Можно, конечно, махнуть на эту мелочь рукой, но… Я решил сделать немножко по-другому. Я использую дополнительный header, в котором задаю новые имена функциям из стандартных Си-шных библиотек. Например: malloc превращается в MemAlloc.

ужас, ты не понимаешь идею C. делаешь из C какой-то паскаль. лучше поройся в исходниках linux, чтобы определиться с стилем кодирования. и ещё не надо делать каких-то приставок к именам, для этого придумали ключевое слово static.
PM MAIL   Вверх
TheVoid
Дата 12.7.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Цитата(DEADHUNT @  12.7.2009,  17:13 Найти цитируемый пост)
похоже ты действительно ничего не понимаешь в построении компиляторов

Нет, я правда не профессионал на этом поприще. Я только учусь.


Цитата(DEADHUNT @  12.7.2009,  17:13 Найти цитируемый пост)
поскольку сложность утверждений if, while, for практически одинаковая

И что из этого утверждения следует? 


Цитата(DEADHUNT @  12.7.2009,  17:13 Найти цитируемый пост)
а если думаешь потом писать компилятор C++

Нет, я не настолько псих  smile 


Цитата(DEADHUNT @  12.7.2009,  17:13 Найти цитируемый пост)
в первую очередь задумайся о сканере, что бы решать разные не однозначности

Решим. Как только лбом упремся в это дело.

Цитата(Shitbox2 @  12.7.2009,  17:42 Найти цитируемый пост)
Лучше начни писать не компилятор, а визуальную надстройку на компилятор

Не-а, это не входит в мои приоритеты.


Цитата(Shitbox2 @  12.7.2009,  17:42 Найти цитируемый пост)
Навыки программирования графики и особенно таких компиляторов в скором времени будут сильно востребованы

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


Цитата(DEADHUNT @  12.7.2009,  18:14 Найти цитируемый пост)
ужас, ты не понимаешь идею C

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

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

Это сообщение отредактировал(а) TheVoid - 12.7.2009, 18:40
PM   Вверх
DEADHUNT
Дата 12.7.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



в С нету не однозначностей, особенно по стандарту C99(где уже запретили default-int и соответственно конструкции вида main(){...}), значит отпадает необходимость в сканере с откатом. как разбор будет происходить? LL(k), LR(k) анализатор(или ещё что-то в этом духе) или рекурсивный спуск? как препроцессор будет работать? и вообще очень советую начинать конструирование компилятора начиная с первой страницы стандарта(много для себя откроешь! знаю по себе).

Это сообщение отредактировал(а) DEADHUNT - 12.7.2009, 19:07
PM MAIL   Вверх
beroal
Дата 12.7.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 18.1.2003
Где: Украина

Репутация: 1
Всего: 3



Цитата(DEADHUNT @ 12.7.2009,  14:13)
в первую очередь задумайся о сканере

Что есть «сканер»?
PM WWW   Вверх
TheVoid
Дата 12.7.2009, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Цитата(DEADHUNT @  12.7.2009,  19:05 Найти цитируемый пост)
с первой страницы стандарта

Лежит у меня на рабочем столе, только читаю редко, английский не настолько хорошо знаю.

О том, как будет все происходит я напишу в следующих статьях smile
PM   Вверх
bilbobagginz
Дата 12.7.2009, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



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

Кроме этого для экспериментов есть несколько готовых инструментов лексического анализа, напр. flex (наследник lex-а) и синтактического анализа, как напр. Bison (наследник YaCC-а).

удачи.


Это сообщение отредактировал(а) bilbobagginz - 12.7.2009, 19:47


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Абабо
Дата 15.7.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 14.1.2005

Репутация: 1
Всего: 1



TheVoid > есть интересные идеи по новому очищенному диалекту Си. Вот некоторые из них:
 - точные типы данных (соответственно поддержка только стандартных архитектур);
 - модульная структура, соответственно отказ от include (чтобы не париться с include guard, не пересканировать тонны заголовков для каждого исходника);
 - сложный (возможно lisp-подобный) препроцессор (но как органичная часть языка), позволяющий вызывать собственные функции (написанные на этом же языке) во время компиляции;
 - пресловутый контроль на выход за пределы массива (возможно, с возможностью отказа от него для финальной сборки);
 - некоторые дополнительные возможности (включая, инициализация массивов переменной длины (чего нету в в старом распространённом Си-стандарте), анонимная инициализация массивов и структур, ...);

Самому нет времени этим заниматься (я болею не компиляторами, а распределёнными средами / ОС), но с удовольствием бы принял участие в обсуждении. Пока вынужден работать с Си, за неимением лучшей альтернативы... вот высказываю пожелания... 

Короче, если тебя это заинтересует - пиши в личку или на мыло. В любом случае, желаю тебе удачи в твоих благих начинаниях.
--------------------
С уважением, Абабо.
PM MAIL   Вверх
beroal
Дата 15.7.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 18.1.2003
Где: Украина

Репутация: 1
Всего: 3



Цитата(Абабо @ 15.7.2009,  14:00)
TheVoid > есть интересные идеи по новому очищенному диалекту Си

Чем отличается от Java или C#?

Это сообщение отредактировал(а) beroal - 15.7.2009, 23:19
PM WWW   Вверх
DEADHUNT
Дата 9.8.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



разработка уже свернулась?
PM MAIL   Вверх
TheVoid
Дата 16.8.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Нет. В последнее время я был занят другими вещами (игрушку делал, давненько хотелось). В ближайшее время планирую вернуться.
PM   Вверх
DEADHUNT
Дата 17.8.2009, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  16.8.2009,  22:40 Найти цитируемый пост)
Нет. В последнее время я был занят другими вещами (игрушку делал, давненько хотелось). В ближайшее время планирую вернуться. 

интересно будет посмотреть как ты хотя бы препроцессор реализуешь.
PM MAIL   Вверх
Killerman
Дата 28.8.2009, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



А вы разрабатывали грамматики для С компилятора? Не в курсе где можно их посмотреть.  smile 

а лучше С++

Это сообщение отредактировал(а) Killerman - 28.8.2009, 18:46
PM MAIL   Вверх
DEADHUNT
Дата 30.8.2009, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(Killerman @  28.8.2009,  18:37 Найти цитируемый пост)
А вы разрабатывали грамматики для С компилятора? Не в курсе где можно их посмотреть.  smile 

а лучше С++

а по его исходникам не видно?
если невидно тогда - нет.
PM MAIL   Вверх
Lazin
Дата 6.9.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: нет
Всего: 154



почему, всех так тянет писать именно компиляторы, что в этом интересного? лучше-бы вы написали интерпретатор языка С++, что-бы можно было использовать REPL(Read Eval Print Loop) во время написания кода smile 
PM MAIL Skype GTalk   Вверх
DEADHUNT
Дата 6.9.2009, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(Lazin @  6.9.2009,  13:34 Найти цитируемый пост)
почему, всех так тянет писать именно компиляторы, что в этом интересного? лучше-бы вы написали интерпретатор языка С++, что-бы можно было использовать REPL(Read Eval Print Loop) во время написания кода smile  

интересно чем это лучше?
PM MAIL   Вверх
Lazin
Дата 7.9.2009, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: нет
Всего: 154



Цитата(DEADHUNT @  6.9.2009,  23:03 Найти цитируемый пост)
интересно чем это лучше?

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

template<int index, class Object>
typename boost::fusion::result_of::at_c<typenameObject::sequence_type, index>::type at_c(Object& s)
{
    return boost::fusion::at_c<index>(s.sequence_);
}
в том или ином месте

ну а потом можно собрать релиз версию нормальным компилятором smile 
вообще, такой интерпретатор уже существует(правда не помню, как он называется), но там очень плохая поддержка стандарта
PM MAIL Skype GTalk   Вверх
DEADHUNT
Дата 8.9.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(Lazin @  7.9.2009,  08:33 Найти цитируемый пост)
а еще, неплохо было-бы иметь отладчик времени компиляции, к примеру, для того, что-бы иметь возможность проверить, значение какого типа будет возвращать эта ф-я

для этого есть typeid
PM MAIL   Вверх
Lazin
Дата 8.9.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: нет
Всего: 154



Цитата(DEADHUNT @  8.9.2009,  22:32 Найти цитируемый пост)
для этого есть typeid

ну вообще-то, typeid немного для другого... во всяком случае уж точно не для того, что-бы отлаживать вывод типов в шаблонах smile 
PM MAIL Skype GTalk   Вверх
Killerman
Дата 9.9.2009, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



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

А компилятор С++ я создавать не собираюсь, во всяком случае не для перевода на ассемблер и интерпритатор тоже, ну точно не для С++.

Добавлено через 5 минут и 36 секунд
2 DEADHUNT
И вообще не понимаю, как можно на основании исходников компилятора увидить его грамматику. Если его синтаксический анализатор строиться и работает на основе сгенерированных таблиц, помтроенных из грамматик генератором компиляторов. А из этих таблиц грамматику вытащить нереально.   
PM MAIL   Вверх
DEADHUNT
Дата 9.9.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(Killerman @  9.9.2009,  12:10 Найти цитируемый пост)
И вообще не понимаю, как можно на основании исходников компилятора увидить его грамматику. Если его синтаксический анализатор строиться и работает на основе сгенерированных таблиц, помтроенных из грамматик генератором компиляторов. А из этих таблиц грамматику вытащить нереально.    

различают типы разборов(основные):
    рекурсивный спуск или детерминированный алгоритм низходящего разбора (как в данном случае),
    детерминированный алгоритм восходящего разбора,
    LL(k) анализатор,
    LR(k), LALR(k) анализаторы(можно сгенерировать с помощью lex + yacc).
только последние два используют "управляющие таблицы" которые создаются на основе грамматики.
     

Это сообщение отредактировал(а) DEADHUNT - 9.9.2009, 15:05
PM MAIL   Вверх
Killerman
Дата 9.9.2009, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



ну для С++ нужны 2-ва последних.
PM MAIL   Вверх
DEADHUNT
Дата 10.9.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(Killerman @  9.9.2009,  23:05 Найти цитируемый пост)
ну для С++ нужны 2-ва последних. 

это кто тебе сказал? я например первый использую(g++ кстати тоже первый способ)
PM MAIL   Вверх
Killerman
Дата 11.9.2009, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



рекурсивный спуск (LL)? так оно токо для простеньких грамматик.

Добавлено через 1 минуту и 20 секунд
и возьни много. убирать левую рекурсию. Убирать е-правила.
А LR очень наглядно работает.
PM MAIL   Вверх
DEADHUNT
Дата 11.9.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(Killerman @  11.9.2009,  00:52 Найти цитируемый пост)
рекурсивный спуск (LL)? так оно токо для простеньких грамматик.

рекурсивный спуск(если не знаешь что такое посмотри в книжке) != LL(k)
по твоему кроме LL/LR анализаторов больше никак нельзя провести синтаксический анализ(и без всяких Эрли и Коко-Янгера-Косами(CYK))?
PM MAIL   Вверх
Killerman
Дата 11.9.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Я пользуюсь тем чем умею. LL мне не подходит.
О Эрли и Коко-Янгера-Косами(CYK) не слышал или не сшышал под таким названием. Это что, методы рекурсивного спуска? и без левой рекурсии??
PM MAIL   Вверх
Killerman
Дата 11.9.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



А вот, нашел метод (CYK). Ну так тут грамматику нужно преобразоввывать к нормальной форме Хомского. Толку мне с нее потом.

Короче вопрос ушел от темы похоже.  smile 


Это сообщение отредактировал(а) Killerman - 11.9.2009, 15:22
PM MAIL   Вверх
DEADHUNT
Дата 11.9.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(Killerman @  11.9.2009,  15:15 Найти цитируемый пост)
А вот, нашел метод (CYK). Ну так тут грамматику нужно преобразоввывать к нормальной форме Хомского. Толку мне с нее потом.

Короче вопрос ушел от темы похоже.  smile 

поэтому в gcc ничего этого не используется. рекурсивный спуск: http://en.wikipedia.org/wiki/Recursive_descent_parser

Это сообщение отредактировал(а) DEADHUNT - 11.9.2009, 15:59
PM MAIL   Вверх
Killerman
Дата 16.9.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



и какой там метод?
PM MAIL   Вверх
wester
Дата 16.9.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 27.2.2009

Репутация: нет
Всего: 13



а работы начались хотя бы ? или все разговоры затихли на теме рекурсии ?
PM MAIL   Вверх
TheVoid
Дата 16.9.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Цитата(wester @  16.9.2009,  17:36 Найти цитируемый пост)
затихли на теме рекурсии

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

Это сообщение отредактировал(а) TheVoid - 18.9.2009, 11:27
PM   Вверх
Killerman
Дата 17.9.2009, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Для создания компилятора нужно выбрать тип синтаксического анализатора. а также на чем он будет создаваться. не вручную же.
PM MAIL   Вверх
DEADHUNT
Дата 18.9.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(Killerman @  17.9.2009,  22:34 Найти цитируемый пост)
Для создания компилятора нужно выбрать тип синтаксического анализатора. а также на чем он будет создаваться. не вручную же. 

вручную smile , да и вообше front-end не самая сложная часть компилятора, намного сложнее сделать хорошо оптимизирующий back-end(basic-blocks, control flow graph, DJ graph, data-flow analysis, SSA, register interference graph,...).

Это сообщение отредактировал(а) DEADHUNT - 18.9.2009, 13:42
PM MAIL   Вверх
TheVoid
Дата 18.9.2009, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Так, сейчас читаю труды Свердлова - "Языки программирования и методы трансляции", интересно изложено, впитывается организмом лучше, чем Дракон smile
Но у меня возникли трудности с грамматикой моего языка (не в смысле моего собственного, а того подмножества Си, что я выбрал) : не знаю, правильно ли набросал. Вот:

Код

translation_unit        :       external_decl translation_unit
                        |       external_decl
                        ;
external_decl           :       function_definition
                        |       decl
                        ;
function_definition     :       decl_specs declarator compound_stat
                        ;
decl                    :       decl_specs ';'
                        ;
decl_list               :       decl decl_list
                        |       decl
                        ;
decl_specs              :       type_spec decl_specs
                        |       type_spec
                        ;
type_spec               :       'void' | 'char' | 'short' | 'int'
                        |       'signed' | 'unsigned'
                        ;
declarator              :       direct_declarator
                        ;
direct_declarator       :       id '(' param_type_list ')'
                        |       id
                        ;
param_type_list         :       param_list
                        ;
param_list              :       param_decl ',' param_list
                        |       param_decl
                        ;
param_decl              :       decl_specs declarator
                        |       decl_specs
                        ;
stat                    :       exp_stat
                        |       compound_stat
                        |       if_stat
                        |       return_stat
                        ;
exp_stat                :       exp ';'
                        |       ';'
                        ;
compound_stat           :       '{' decl_list stat_list '}'
                        |       '{' stat_list '}'
                        |       '{' decl_list '}'
                        |       '{' '}'
                        ;
stat_list               :       stat stat_list
                        |       stat
                        ;
if_stat                 :       'if' '(' exp ')' stat 'else' stat
                        |       'if' '(' exp ')' stat 
                        ;
return_stat             :       'return' exp ';'
                        |       'return' ';'
                        ;
exp                     :       assignment_exp ',' exp
                        |       assignment_exp
                        ;
assignment_exp          :       unary_exp assignment_operator assignment_exp
                        |       conditional_exp
                        ;
assignment_operator     :       '='
                        ;
conditional_exp         :       equality_exp
                        ;
equality_exp            :       relational_exp '==' equality_exp
                        |       relational_exp '!=' equality_exp
                        |       relational_exp
                        ;
relational_exp          :       additive_exp '<' relational_exp
                        |       additive_exp '>' relational_exp
                        |       additive_exp '<=' relational_exp
                        |       additive_exp '>=' relational_exp
                        |       additive_exp
                        ;
additive_exp            :       mult_exp '+' additive_exp
                        |       mult_exp '-' additive_exp
                        |       mult_exp
                        ;
mult_exp                :       unary_exp '*' mult_exp
                        |       unary_exp '/' mult_exp
                        |       unary_exp
                        ;
unary_exp               :       postfix_exp
                        |       unary_operator unary_exp
                        ;
unary_operator          :       '+' | '-' | '!'
                        ;
postfix_exp             :       primary_exp '(' argument_exp_list ')'
                        |       primary_exp '(' ')'
                        |       primary_exp
                        ;
primary_exp             :       id
                        ;
argument_exp_list       :       assignment_exp ',' argument_exp_list
                        |       assignment_exp
                        ;


По идее, на текущем этапе заполняется таблица имен и создается ситаксическое дерево, которое я заменю четверками. Буду признателен за комментарии (а то я что-то ничего не спрашиваю, как-то молча все стряпаю и обижаюсь, что никому нет дела smile )


Это сообщение отредактировал(а) TheVoid - 18.9.2009, 20:45
PM   Вверх
DEADHUNT
Дата 18.9.2009, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



а семантических правил ещё нету?
PM MAIL   Вверх
TheVoid
Дата 18.9.2009, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Нет, к контекстному анализу еще не дошел. Вообще, раньше всегда обламывался с Таблицей имен - не знал, как правильно организовать.

К счастью, нашел отличную тулзу VisualBNF - она поможет решить вопросы с грамматикой. 
PM   Вверх
DEADHUNT
Дата 18.9.2009, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  18.9.2009,  22:11 Найти цитируемый пост)
раньше всегда обламывался с Таблицей имен - не знал, как правильно организовать.

а в чём проблема, список не мог организовать(лучше hash таблицу)?
PM MAIL   Вверх
TheVoid
Дата 18.9.2009, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Это еще когда писал компилятор Паскаля на Делфи, чего-то там со вложенными процедурами не разобрался.
Ну, сейчас-то я примерно понимаю, как это должно выглядеть.
PM   Вверх
DEADHUNT
Дата 18.9.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



можно стэк списков.

Это сообщение отредактировал(а) DEADHUNT - 18.9.2009, 22:43
PM MAIL   Вверх
Killerman
Дата 19.9.2009, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



TheVoid, так для С++ есть стандартизированная грамматика (то о чем я спрашивал раньше), не надо ничего выдумывать.

DEADHUNT, как это вручную сделать компилятор? не понимаю. какими методами. через LR синтаксис вручную сделать нереально. а семантику можно и вручную.
PM MAIL   Вверх
TheVoid
Дата 19.9.2009, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Killerman, в учебных целях я занят реализацией ANSI C (см. первый пост). Логично, что 
Цитата

стандартизированная грамматика С++
 
сюда не катит.

(Ну если быть откровенным вначале хочу осилить только подмножество Си, поэтому есть смысл грамматику выдумывать самостоятельно).
PM   Вверх
DEADHUNT
Дата 19.9.2009, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(Killerman @  19.9.2009,  00:07 Найти цитируемый пост)
через LR синтаксис вручную сделать нереально

реально, только вначале на листке надо будет составлять автоматные таблицы, а вообще я не говорил про LL/LR, я говорил про http://en.wikipedia.org/wiki/Recursive_descent_parser, не верится посмотри исходникики g++.
PM MAIL   Вверх
Killerman
Дата 19.9.2009, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



DEADHUNT, не знаю, там токо 2-ве строчки про этот метод:
A recursive descent parser is a top-down parser built from a set of mutually-recursive procedures (or a non-recursive equivalent) where each such procedure usually implements one of the production rules of the grammar. Thus the structure of the resulting program closely mirrors that of the grammar it recognizes.

и все.

LR для С++ вручную не получится, так как там таблица будет дето 3000 X 100. если не больше

Добавлено через 9 минут и 38 секунд
Хотя в принципеесли оптимизировать, может быть и 3000Х20. но это всеравно не для ручной работы

Это сообщение отредактировал(а) Killerman - 19.9.2009, 08:24
PM MAIL   Вверх
DEADHUNT
Дата 19.9.2009, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(Killerman @  19.9.2009,  08:23 Найти цитируемый пост)
там токо 2-ве строчки про этот метод

зато пример парсера есть.
Цитата(Killerman @  19.9.2009,  08:23 Найти цитируемый пост)
Хотя в принципеесли оптимизировать, может быть и 3000Х20. но это всеравно не для ручной работы

ты хоть понимаешь что такое управляющая LR(1) таблица? строки состояния, столбцы входные аванцепочки. как ты собрался оптимизировать аванцепочки с 100 до 20? smile 
PM MAIL   Вверх
Killerman
Дата 19.9.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



DEADHUNT, я понимаю.  имею некоторый опыт. там идет оптимизация терминалов.

TheVoid, все же С++, это не просто цыклы или там списки присвоений.
там гемора хватает. хотябы с шаблонами. а ты делаешь не С++ и даже не С.

написал бы - хочу создать свой функциональный язык. и все

Это сообщение отредактировал(а) Killerman - 19.9.2009, 20:45
PM MAIL   Вверх
DEADHUNT
Дата 19.9.2009, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(Killerman @  19.9.2009,  20:39 Найти цитируемый пост)
там идет оптимизация терминалов.

терминалы нельзя оптимизировать. например терминалы a-z, A-Z как ты оптимизируешь, A-Z выкинешь? оптимизировать можно путём удаления эквивалентных состояний(у которых одинаковые "ядра" в LALR) и получить столько же состояний сколько в SLR анализаторе.
PM MAIL   Вверх
Killerman
Дата 19.9.2009, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



А что такое a-z, A-Z ? это не терминал никакой.

Добавлено через 32 секунды
вот почитай. полезная статья http://www.arbinada.com/main/node/54

Добавлено через 4 минуты и 13 секунд
кстати по этой ссылке http://en.wikipedia.org/wiki/Recursive_descent_parser написано:

Recursive descent parsers are particularly easy to implement in functional languages such as Haskell, Lisp or ML.

чето не вижу что оно такое же хорошее для сложный языков
PM MAIL   Вверх
DEADHUNT
Дата 19.9.2009, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



A-Z - имелись ввиду как терминальные символы(из них идентификаторы состоят, просто для примера)
S -> aBcd
B -> Sa | e
в этой грамматике нетерминальные символы {S, B}, терминальные {a, c, d}
PM MAIL   Вверх
Killerman
Дата 19.9.2009, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



и вообще в том примере по этой же ссылке грамматика не леворекурсионная. в EBNF форме.
там такие приколы как:

S:= S+M не прокатят

Добавлено через 1 минуту и 50 секунд
Цитата(DEADHUNT @ 19.9.2009,  22:19)
A-Z - имелись ввиду как терминальные символы(из них идентификаторы состоят, просто для примера)
S -> aBcd
B -> Sa | e
в этой грамматике нетерминальные символы {S, B}, терминальные {a, c, d}

ну здесь конечно никак.

PM MAIL   Вверх
DEADHUNT
Дата 19.9.2009, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(Killerman @  19.9.2009,  22:22 Найти цитируемый пост)
и вообще в том примере по этой же ссылке грамматика не леворекурсионная

это просто контекстно-свободная грамматика, только чтобы показать где терминалы, а где нетерминалы.
PM MAIL   Вверх
TheVoid
Дата 19.9.2009, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Ух, блин, что за дебаты.

Цитата(Killerman @  19.9.2009,  20:39 Найти цитируемый пост)
а ты делаешь не С++ и даже не С.написал бы - хочу создать свой функциональный язык. и все


Я написал вполне четко: вначале - подмножество Си, затем полный ANSI C.

PM   Вверх
DEADHUNT
Дата 19.9.2009, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  19.9.2009,  23:30 Найти цитируемый пост)
Я написал вполне четко: вначале - подмножество Си, затем полный ANSI C.

где-то валялась эта старая книга ANSI C, с не слишким подробным описанием C. лучше C99 к тому же уже разрабатывают C99-1X
PM MAIL   Вверх
TheVoid
Дата 19.9.2009, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Руководствуюсь, в основном, K&R, хотя на полке пылится Шилдт со своим "Полным описанием С" (С99). Да нет, конечно, мне не претят новые веяния, обновленные стандарты и прочее, только хочу сейчас сосредоточиться на базовых вещах, я ведь учусь в первую очередь.

Это сообщение отредактировал(а) TheVoid - 20.9.2009, 11:42
PM   Вверх
DEADHUNT
Дата 20.9.2009, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  19.9.2009,  23:58 Найти цитируемый пост)
Руководствуюсь, в основном, K&R, хотя на полке пылится Шилдт со своим "Полным описанием С" (С99). Да нет, конечно, мне не претят новые веяния, обновленные стандарты и прочее, только хочу сейчас сосредоточиться на базовых вещах, я ведь учусь в первую очередь.

я имел ввиду в электронном виде, C99 вообще-то здесь находится http://www.open-std.org/JTC1/SC22/WG14/

Это сообщение отредактировал(а) DEADHUNT - 20.9.2009, 00:02
PM MAIL   Вверх
TheVoid
Дата 20.9.2009, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



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

Книга-книгой, но а вдруг я что-то понял неправильно.

Это сообщение отредактировал(а) TheVoid - 20.9.2009, 11:44
PM   Вверх
DEADHUNT
Дата 20.9.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  20.9.2009,  11:43 Найти цитируемый пост)
Книга-книгой, но а вдруг я что-то понял неправильно.

приведи пример, в документации к yacc всё описано(много разных тонкостей).
Код
type_spec_seq : type_spec_seq type_spec { семантические правила }
                             | type_spec { семантические правила }
                             ;

simple_type_spec : "void" { $$ = void_type; }
                                  | "char" { $$ = char_type; }
                                  ...
                                  ;

PM MAIL   Вверх
TheVoid
Дата 20.9.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Yacc-ом я не пользуюсь, все вручную.

Цитата(DEADHUNT @  20.9.2009,  12:48 Найти цитируемый пост)
приведи пример

По грамматике строится нисходящий синтаксический анализатор, народе

Код

<Var Decl>    ::=    <Type> <Var> <Var List>  ';'             
<Var>    ::=    ID             
<Var List>    ::=    ',' <Var> <Var List>
         | 


Код

void SVarDecl(void)
{
    SType();
    SVar();
    SVarList();
    Match(';');
}


Хм... в общем-то я и не представляю, что делать дальше smile

Это сообщение отредактировал(а) TheVoid - 20.9.2009, 12:59
PM   Вверх
DEADHUNT
Дата 20.9.2009, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  20.9.2009,  12:58 Найти цитируемый пост)
Yacc-ом я не пользуюсь, все вручную.

тогда ты наверное год будешь LR списки высчитывать(чтобы таблицы Action, Goto затем построить), потом где нибудь ошибёшься, ну и дальнейшее расширение станет не возможным(надо будет поновой таблицу строить, оптимизировать, ...), ну и самое главное не выйдет у тебя анализатор.

вроде с умом начинал препроцессор делать, а теперь....

Добавлено через 1 минуту и 48 секунд
Цитата(TheVoid @  20.9.2009,  12:58 Найти цитируемый пост)
Yacc-ом я не пользуюсь, все вручную.

значит рекурсивный спуск(без использования LL/LR/... анализаторов), зачем только тогда грамматику составлять?
PM MAIL   Вверх
TheVoid
Дата 20.9.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Цитата(DEADHUNT @  20.9.2009,  14:08 Найти цитируемый пост)
зачем только тогда грамматику составлять?

Возможно, я чего-то не понял, но... В смысле - зачем?
Для рекурсивного нисходящего парсера нужны правила, по которым будут строится "парсящие процедуры", по терминологии Википедии. Я смотрю на правила и по ним пишу соответствующие функции. 
PM   Вверх
DEADHUNT
Дата 20.9.2009, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  20.9.2009,  14:17 Найти цитируемый пост)
Для рекурсивного нисходящего парсера нужны правила, по которым будут строится "парсящие процедуры", по терминологии Википедии

типо того, только зачем их составлять если всё это описано в стандарте(в разделе grammar summary находятся полная грамматика)?
PM MAIL   Вверх
TheVoid
Дата 20.9.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Цитата(DEADHUNT @  20.9.2009,  14:36 Найти цитируемый пост)
находятся полная грамматика

Грамматика подмножества != Полная грамматика
PM   Вверх
DEADHUNT
Дата 20.9.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  20.9.2009,  14:43 Найти цитируемый пост)
Грамматика подмножества != Полная грамматика

выбрасывай из полной грамматики что тебе надо.

Это сообщение отредактировал(а) DEADHUNT - 20.9.2009, 15:00
PM MAIL   Вверх
TheVoid
Дата 21.9.2009, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Итак, по упрощенной грамматике написал синтаксический анализатор. Текущее состояния сего чуда инженерной мысли - допуск /отказ входного файла. Причем, анализ поверхностный: имена переменных не вносятся в таблицу символов, соответственно, не проверяется, были ли они объявлены ранее или нет.
Меня интересует следующие: как прикрутить семантический анализ?

Вот, кое-что из исходного кода, посмотрите и скажите, насколько он плох:

Код

// Получение типа текущего токена
static int Token(void)
{
    return ScanGetToken()->tokType;
}

// Проверка соответствия
static void Match(int t)
{
    if (ScanGetToken()->tokType == t) ScanNextToken();
    else Error(ERR__SYN__UNMATCH_TOKEN);
}

// Lookahead
static int Lookahead(void)
{
    ScanNextToken();
    int look = ScanGetToken()->tokType;
    ScanUnGetToken();
    return look;
}

// Грамматика SimplexC

extern void p_Decls(void);
extern void p_Decl(void);
extern void p_FunctionDefinition(void);
extern void p_VariableDefinition(void);
...

// Синтаксический разбор
void p_Decls(void)
{
    while (Token() != TOKEN_EOF)
    {
        p_Decl();
    }
}

void p_Decl(void)
{
    // Получение типа
    p_Type();
    // Определение
    if (Lookahead() == TOKEN_LBR) p_FunctionDefinition();
    else p_VariableDefinition();
}

void p_VariableDefinition(void)
{
    p_Variables();
    Match(TOKEN_SEMI);
}

void p_Variables(void)
{
    p_Variable();
    while (Token() == TOKEN_COMMA)
    {
        Match(TOKEN_COMMA);
        p_Variable();
    }
}

void p_Variable(void)
{
    Match(TOKEN_ID);
}

void p_FunctionDefinition(void)
{
    Match(TOKEN_ID);
    Match(TOKEN_LBR);
    p_Params();
    Match(TOKEN_RBR);
    p_Block();
}

...



PM   Вверх
DEADHUNT
Дата 21.9.2009, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Код

static int Match(int t)
{
    if (ScanGetToken()->tokType == t) 
    {
        ScanNextToken();
        return 1;
     }
    else 
    {
        Error(ERR__SYN__UNMATCH_TOKEN);
        return 0;
    }
}

у тебя даже нигде не идёт распознание типов(type specifier), так-что тебе и проверять нечего.
PM MAIL   Вверх
TheVoid
Дата 21.9.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Чего-чего? Это к синтаксическому анализу вообще относится или к чему?
PM   Вверх
DEADHUNT
Дата 21.9.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  21.9.2009,  22:15 Найти цитируемый пост)
Чего-чего? Это к синтаксическому анализу вообще относится или к чему? 

кто относится?
PM MAIL   Вверх
TheVoid
Дата 21.9.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Понятно.
Короче говоря, вопрос решен, всем спасибо, все свободны.
PM   Вверх
DEADHUNT
Дата 21.9.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  21.9.2009,  22:36 Найти цитируемый пост)
Короче говоря, вопрос решен, всем спасибо, все свободны. 

а не увидел p_Type(), почему возвращает void? должна тип возвращать
PM MAIL   Вверх
TheVoid
Дата 21.9.2009, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



О, а вот это другой вопрос. Функции-нетерминалы что-то должны возвращать и принимать, да?
PM   Вверх
DEADHUNT
Дата 21.9.2009, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  21.9.2009,  22:44 Найти цитируемый пост)
О, а вот это другой вопрос. Функции-нетерминалы что-то должны возвращать и принимать, да? 

причём здесь грамматика, сам уже думай где что должно возвращаться. просто при разборе decl_specifier тебе надо знать type_specifier(а ты его не знаешь). и вообше где у тебя структура которая описывает тип?
PM MAIL   Вверх
TheVoid
Дата 21.9.2009, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



В том-то и проблема, что как-то не могу свести все воедино в плане кто чего возвращает и принимает. Наверное, это от того, что я заботился об единообразии, то есть каждая функция автономна и... все.
Собственно, тип:

Код

void p_Type(void)
{
    switch (Token())
    {
        case TOKEN_KWSIGNED : 
            Match(TOKEN_KWSIGNED);
                switch (Token())
                {
                    case TOKEN_KWCHAR : Match(TOKEN_KWCHAR); break;
                    case TOKEN_KWSHORT : Match(TOKEN_KWSHORT); break;
                    default : Match(TOKEN_KWINT); break;
                }
            break;
        case TOKEN_KWUNSIGNED : 
            Match(TOKEN_KWUNSIGNED);
                switch (Token())
                {
                    case TOKEN_KWCHAR : Match(TOKEN_KWCHAR); break;
                    case TOKEN_KWSHORT : Match(TOKEN_KWSHORT); break;
                    default : Match(TOKEN_KWINT); break;
                }
            break;
        case TOKEN_KWCHAR : Match(TOKEN_KWCHAR); break;
        case TOKEN_KWINT : Match(TOKEN_KWINT); break;
        case TOKEN_KWSHORT : Match(TOKEN_KWSHORT); break;
        default : Match(TOKEN_KWVOID);
    }
}

PM   Вверх
DEADHUNT
Дата 21.9.2009, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  21.9.2009,  22:53 Найти цитируемый пост)
Собственно, тип:

ты просто синтаксическую проверку делаешь(и то не правильно), а надо ещё информацию о типе собирать. про тип имеется:
Код
typedef struct TYPE {
    enum type_kind kind;
    ....
} TYPE;

TYPE *p_Type(void);

PM MAIL   Вверх
TheVoid
Дата 21.9.2009, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Цитата(DEADHUNT @  21.9.2009,  22:59 Найти цитируемый пост)
и то не правильно

Как правильно?

Пока что тип у меня вмещается в int, так как указателей, структур и прочего нет. Что есть:
TYPE_ERROR
TYPE_VOID
TYPE_UCHAR
TYPE_CHAR
TYPE_USHORT
TYPE_SHORT
TYPE_UINT
TYPE_INT
TYPE_FUNCTION
PM   Вверх
DEADHUNT
Дата 21.9.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  21.9.2009,  23:05 Найти цитируемый пост)
Как правильно?

просто у тебя не допускается даже такой тип как:
long unsigned, ...
функция - тоже составной(сложный) тип, так как имеет возвращаемый тип, параметры, и дополнительные атрибуты.
PM MAIL   Вверх
TheVoid
Дата 21.9.2009, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Цитата(DEADHUNT @  21.9.2009,  23:10 Найти цитируемый пост)
long unsigned

Да, это есть. Нужно было так:

Код

... p_Types(...)
{
    p_Type();
    ...
    p_Types();
}

... pType(...)
{
    switch ...
    {
        case UNSIGNED : ... ;
        case CHAR : ...;
        ...
    }
}


Только я не сообразил, как потом делать проверку...

В случае с функцией, возвращаемый тип, атрибуты и параметры должны были войти в отведенный на нее элемент Таблицы Имен. Неужели все эта инцформация должна хранится в структуре, описивающей Тип?
PM   Вверх
DEADHUNT
Дата 21.9.2009, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  21.9.2009,  23:16 Найти цитируемый пост)
Да, это есть. Нужно было так:

можно и так
Код
for ( ; ; )
{
    switch (...)
    {
    ...
    }
}

Цитата(TheVoid @  21.9.2009,  23:16 Найти цитируемый пост)
Неужели все эта инцформация должна хранится в структуре, описивающей Тип? 

а как же
void (*foo)();
foo = test; // какой тип у test?
PM MAIL   Вверх
TheVoid
Дата 21.9.2009, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Цитата(DEADHUNT @  21.9.2009,  23:20 Найти цитируемый пост)
можно и так

И все-таки, как в таком случае проверить корректность типа? Простым if (t1 == ... && t1 == ... & t2 == ...) ведь не обойдешься.

Тип TYPE_POINTER? ))
PM   Вверх
DEADHUNT
Дата 22.9.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  21.9.2009,  23:41 Найти цитируемый пост)
И все-таки, как в таком случае проверить корректность типа? Простым if (t1 == ... && t1 == ... & t2 == ...) ведь не обойдешься.

можно битовую маску использовать.
Цитата(TheVoid @  21.9.2009,  23:41 Найти цитируемый пост)
Тип TYPE_POINTER? )) 

мало знать про тип что он только указатель.
PM MAIL   Вверх
DEADHUNT
Дата 12.10.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



TheVoid почему свой блог удалил?

Это сообщение отредактировал(а) DEADHUNT - 12.10.2009, 11:39
PM MAIL   Вверх
TheVoid
Дата 14.10.2009, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Свернулся. В какой-то момент понял, что откусил больше, чем могу съесть...
Поизучаю исходники, укреплю теор. базу, как-нибудь потом возьмусь с новыми силами... Или свой язык придумаю (а почему бы и нет?), все-таки есть пару вещей, которых мне не хватает в Си, иморт функций из Длл, например (как в Делфи). Подумаем, очнемся от наплыва объемной информации, и в бой )
PM   Вверх
DEADHUNT
Дата 15.10.2009, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(TheVoid @  14.10.2009,  23:43 Найти цитируемый пост)
которых мне не хватает в Си, иморт функций из Длл, например (как в Делфи). Подумаем, очнемся от наплыва объемной информации, и в бой ) 

во первых это есть, а во вторых не везде же M$ Windows с DLL
PM MAIL   Вверх
bilbobagginz
Дата 15.10.2009, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



Цитата(DEADHUNT @  15.10.2009,  18:19 Найти цитируемый пост)
во первых это есть, а во вторых не везде же M$ Windows с DLL 

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



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
dima121
Дата 16.10.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 16.10.2009

Репутация: нет
Всего: нет



Жаль, было интересно почитать.

Добавлено через 4 минуты и 15 секунд
DEADHUNT, а какой софт ты используешь для разработки интерфейса своей среды разработки:
http://wiki.develsoftware.com/index.php/%D...dio_screen1.png

Это С#, вижуал С++ с их новым языком или еще чтото?
PM MAIL   Вверх
DEADHUNT
Дата 16.10.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.11.2008

Репутация: нет
Всего: нет



Цитата(dima121 @  16.10.2009,  11:32 Найти цитируемый пост)

Это С#, вижуал С++ с их новым языком или еще чтото? 

там достаточно старый скриншот, а вообще используется C++(gcc) && Qt 4.5. подробнее про ход разработки можно здесть почитать http://www.forum.crossplatform.ru/index.php?showforum=24.
PM MAIL   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Совместные проекты/поиск партнёров"
Snowy
Poseidon

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

Этот раздел только для проектов в которых Вы будете выступать в качестве исполнителя!

Темы и сообщения, не удовлетворяющие данным правилам, будут удаляться на основании пункта 3 Правил форума!

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

  • Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, Poseidon

     
    0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
    0 Пользователей:
    « Предыдущая тема | Совместные проекты/поиск партнёров | Следующая тема »


     




    [ Время генерации скрипта: 0.2502 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


    Реклама на сайте     Информационное спонсорство

     
    По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
    Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.