Есть несколько проблем с тем, что вы делаете.Прежде всего, поскольку YYSTYPE
является указателем на символ, на самом деле для строки не выделено места.Поэтому, когда вы делаете sprintf($$, "%s", &$1)
, вы пытаетесь напечатать строку в указатель, который не инициализирован ($$
является указателем, но ни на что не инициализирован, поэтому может указывать на любое место в памяти.)
Другая проблема может быть вашим использованием &$1
в sprintf
.Он принимает адрес указателя, а не фактическую строку, на которую указывает указатель.
Третья проблема - вы используете strdup
в лексере, который выделяет память.Но вы никогда не освобождаете его где-то, что приводит к утечке памяти.
Четвертая и последняя проблема заключается в том, почему вы получаете только один символ, и вам действительно повезло, что вы это получили, и это потому, что пока strdup(yytext)
возвращаетсякопия строки, звезда перед ней возвращает разыменованный указатель, который является символом.Таким образом, вы устанавливаете указатель на один символ.
Редактировать: Надеюсь, все это имеет смысл, уже поздно, и я мог бы выпить стакан вина или два ...