powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анализ исходного кода. Разбор IOCCC 1985 august
25 сообщений из 281, страница 2 из 12
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780726
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryпропущено...

Перед собой поставил более глобальную задачу, написать синтаксический анализатор языка Си
Чето мне нехорошо стало... пойду накапаю себе капель.
А шо тут такого. Это ж не компилятор, а всего лишь парсер.
Пишется за неделю, при условии что знаешь язык.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780731
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЭто ж не компилятор, а всего лишь парсер.
Пишется за неделю, при условии что знаешь язык.
Готовый YACC файл гуглится за минуту: http://www.quut.com/c/ANSI-C-grammar-y-2011.html
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780738
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ну, чел же ясно сказал, что хочет придумать сам :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782421
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Вчера начала думать более плотно над задачей по частичной имитации работы препроцессора. Составил общий алгоритм. И мне кажется уже понял как это будет работать. Но я не уверен что правильно организовал структуру данных. Как вы считаете ? Как правильней назвать структуры ? Мне кажется названия не совсем корректные. Подскажите пожалуйста

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
//макрозамена
struct Macros
{
	int type;//тип макрозамены
	int count_arg;//количество аргументов
	char* identifier = NULL;
	char** list_arguments = NULL;//массив аргументов
	char* rep_list = NULL;
};

//все макрозамены
struct AllMacros
{
	int count;
	struct Macros* ms = NULL;
};
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782423
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только названия неправильные.
Есть object-like и function-like macro. Согласно стандарту.

ISO/IEC 9899:201x 6.10.3 Macro replacement6.10.3 Macro replacement
Constraints
1 Two replacement lists are identical if and only if the preprocessing tokens in both have
the same number, ordering, spelling, and white-space separation, where all white-space
separations are considered identical.
2 An identifier currently defined as an object-like macro shall not be redefined by another
#define preprocessing directive unless the second definition is an object-like macro
definition and the two replacement lists are identical. Likewise, an identifier currently
defined as a function-like macro shall not be redefined by another #define
preprocessing directive unless the second definition is a function-like macro definition
that has the same number and spelling of parameters, and the two replacement lists are
identical.
3 There shall be white-space between the identifier and the replacement list in the definition
of an object-like macro.
4 If the identifier-list in the macro definition does not end with an ellipsis, the number of
arguments (including those arguments consisting of no preprocessing tokens) in an
invocation of a function-like macro shall equal the number of parameters in the macro
definition. Otherwise, there shall be more arguments in the invocation than there are
parameters in the macro definition (excluding the ...). There shall exist a )
preprocessing token that terminates the invocation.
5 The identifier _ _VA_ARGS_ _ shall occur only in the replacement-list of a function-like
macro that uses the ellipsis notation in the parameters.
6 A parameter identifier in a function-like macro shall be uniquely declared within its
scope.
Semantics
7 The identifier immediately following the define is called the macro name. There is one
name space for macro names. Any white-space characters preceding or following the
replacement list of preprocessing tokens are not considered part of the replacement list
for either form of macro.
8 If a # preprocessing token, followed by an identifier, occurs lexically at the point at which
a preprocessing directive could begin, the identifier is not subject to macro replacement.
9 A preprocessing directive of the form
Код: plaintext
1.
# define identifier replacement-list new-line

defines an object-like macro that causes each subsequent instance of the macro name171)
to be replaced by the replacement list of preprocessing tokens that constitute the
remainder of the directive. The replacement list is then rescanned for more macro names
as specified below.
10 A preprocessing directive of the form
Код: plaintext
1.
2.
3.
# define identifier lparen identifier-listopt ) replacement-list new-line
# define identifier lparen ... ) replacement-list new-line
# define identifier lparen identifier-list , ... ) replacement-list new-line

defines a function-like macro with parameters, whose use is similar syntactically to a
function call. The parameters are specified by the optional list of identifiers, whose scope
extends from their declaration in the identifier list until the new-line character that
terminates the #define preprocessing directive. Each subsequent instance of the
function-like macro name followed by a ( as the next preprocessing token introduces the
sequence of preprocessing tokens that is replaced by the replacement list in the definition
(an invocation of the macro). The replaced sequence of preprocessing tokens is
terminated by the matching ) preprocessing token, skipping intervening matched pairs of
left and right parenthesis preprocessing tokens. Within the sequence of preprocessing
tokens making up an invocation of a function-like macro, new-line is considered a normal
white-space character.
The sequence of preprocessing tokens bounded by the outside-most matching parentheses
forms the list of arguments for the function-like macro. The individual arguments within
the list are separated by comma preprocessing tokens, but comma preprocessing tokens
between matching inner parentheses do not separate arguments. If there are sequences of
preprocessing tokens within the list of arguments that would otherwise act as
preprocessing directives,172) the behavior is undefined.
12 If there is a ... in the identifier-list in the macro definition, then the trailing arguments,
including any separating comma preprocessing tokens, are merged to form a single item:
the variable arguments. The number of arguments so combined is such that, following
merger, the number of arguments is one more than the number of parameters in the macro
definition (excluding the ...).
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782434
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

# и ## будешь обрабатывать?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782438
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
пока что не буду. Сначала нужно сделать это
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782444
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСоставил общий алгоритм
возможную рекурсию учёл?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782445
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилSashaMercuryСоставил общий алгоритм
возможную рекурсию учёл?

Да, буду проходить по тексту циклом до тех пор, пока количество замен за 1 проход не будет равно 0
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782448
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДа, буду проходить по тексту циклом до тех пор, пока количество замен за 1 проход не будет равно 0

рискуешь никогда не остановиться
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782450
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилSashaMercuryДа, буду проходить по тексту циклом до тех пор, пока количество замен за 1 проход не будет равно 0

рискуешь никогда не остановиться

тоже про это думал, но потом прочитал (позже найду где) что такое невозможно.

хм.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782454
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

в твоём алгоритме - возможно
на косвенную рекурсию обрати внимание
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782456
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для зацикливания достаточно написать:
1. заменить А на Б
2. заменить Б на А

Предусматривай выход из такой ситуации.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782591
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Препроцессоры С обычно однопроходные...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782842
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДа, буду проходить по тексту циклом до тех пор, пока количество замен за 1 проход не будет равно 0
Это неправильный подход.
Вместо этого у вас должна быть функция, которая на входе получает идентификатор, а возвращает список токенов после подстановки макроса. И аналогично для function-like macro.
И эти функции используются при токенизации текста перед парсингом.
Это все естественно за один проход делается.
Просто функции рекурсивные.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782926
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
А что вы можете сказать про предложенные структуры ? Я правильно их спроектировал, как вы считаете ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782985
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСпасибо.
А что вы можете сказать про предложенные структуры ? Я правильно их спроектировал, как вы считаете ?
Ну можно и так. :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38783015
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это самое важное сейчас. Спасибо.
Завтра продолжу, у нас уже поздно..
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38783053
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо только учесть, что в реальном проекте был бы не массив макросов, а хеш-таблица.
Иначе не взлетит на больших исходниках, типа стандартных хедеров или winapi.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38783238
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

наличие elipsis ( ... ) в макроопределении имеет смысл в структуре отразить
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38783449
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сашик. Я тебе тест придумал.
Код: plaintext
1.
2.
3.
4.
5.
6.
/* Sasha's Funky test! */
#define TRUE FALSE
#define x xx
#define - --
#define if while
/* Mua-ha-ha.... :) */
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38783570
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСашик. Я тебе тест придумал.
Код: plaintext
1.
2.
3.
4.
5.
6.
/* Sasha's Funky test! */
#define TRUE FALSE
#define x xx
#define - --
#define if while
/* Mua-ha-ha.... :) */



Вот как :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38783571
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нашёл в стандарте, а разве нет ограничений на макроимена(если неправильно называю, то поправьте пожалуйста) ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38784017
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Имена макросов должны быть идентификаторами.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38784820
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Тестирую функцию формирования пространства макроопределения. Подскажите пожалуйста, где я ошибаюсь в работе с памятью ?(или в другом месте)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct Macro
{
	int type;//тип макроопределения, 0:object-like macro,1:function-like macro
	int count_args;//количество аргументов
	char* identifier = NULL;
	char** list_args = NULL;//массив аргументов
	char* rep_list = NULL;
};

struct MacroSpace
{
	int count;
	struct Macro* m = NULL;
};




далее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
//конструктор пространства макроопределений
struct MacroSpace* create_MacroSpace()
{
	struct MacroSpace*	ms = (struct MacroSpace*)malloc(sizeof(struct MacroSpace));
	ms->count = 0;
	return ms;
}



и начало функции в которой возникает ошибка
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
//Добавление макроопределиния к пространству макросов
int add_macros(struct MacroSpace* ms, FILE* in)
{
	ms->count += 1;
	ms->m=(struct Macro*)realloc(ms->m, ms->count*sizeof(struct Macro));
	struct Macro* cur = &(ms->m[ms->count - 1]);//указатель на текущий макрос, создал его чтобы было проще работать в дальнейшем
...
}



и вот вызов функции

Код: plaintext
1.
2.
3.
4.
5.
6.
int main(int argc, char** argv)
{
	FILE* in = fopen("august.c", "r");
	struct MacroSpace* ms = create_MacroSpace();
	add_macros(ms, in);
...



ошибка в функции add_macros.
Диагностическое сообщениеавторUnhandled exception at 0x772BE753 (ntdll.dll) in preprocessing.exe: 0xC0000374: Куча была повреждена (parameters: 0x772F4270)
...
Рейтинг: 0 / 0
25 сообщений из 281, страница 2 из 12
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анализ исходного кода. Разбор IOCCC 1985 august
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]