Доброго времени суток!
Встала задача уметь парсить выражения типа func(arg)
, func(arg1, arg2,arg3)
.
Я подумал, что для этого вполне подойдут двусвязные списки: аргументы парсим по одному, в каждый предыдущий - ссылка на следующий и на предыдущий; когда надо вывести весь список, скатываемся до первого элемента и идем в прямом порядке.
Вот что я наваял: бизон, flex.
Там имеется ряд косяков, которые я не знаю, как поправить:
1) двусвязный список не работает. хз, почему бизон выражения вида $$->prev_arg=$1; $1->next_arg=$$;
трактует неправильно (или я че-то не понял...). А именно - вставляет указатель на сам элемент, а не на предыдущий или следующий.
2) обрабатывает почти корректно только первую введенную строчку. на остальных начинает сыпаться. Почти корректно - в смысле: если подается один аргумент в функцию в первый раз, то он выводится, если второй раз, то говорит, что «ошибка синтаксиса».
3) выражения вида (arg1, arg2) вроде понимает, а (arg1,arg2) не понимает. Дело в пробеле после запятой. Это вроде просто, но я пока не проверял из-за более серьезных ошибок выше.
4) всюду пишут, что использовать strdup
не рекомендуется из-за утечек памяти. Отсюда вопрос - лучше сначала выделить память (байт так 128) и туда все скидывать или же делать динамически? Если динамически, то в каком месте чистить память?