LINUX.ORG.RU

Типы данных в bison


0

1

Вопрос, если распознаю правило вида

A : B C {somefunc($1,$2);}

А сама функция имеет вид вроде somefunc(string b,string c)

Прокатит ли такая конструкция, преобразуется ли то что содержится в $1 , $2 к string, если нет, то как в ручную это сделать? Соответствующие строки во флексе имеют следующий вид B {printf(yytext);yylval=*yytext;return (B);} C {printf(yytext);yylval=*yytext;return (C);} Заранее спасибо.

★★★

Последнее исправление: LIKAN (всего исправлений: 1)

Емнип, bison понимает спецификации типов:

A : B C {somefunc( std::string($1), std::string($2);}

Всё-таки лучше уточни в info bison.

OldFatMan
()

Есть ещё дубовый вариант, который не рекомендуют в мануале:

определить тип данных по умолчанию для данного контекста bison

%{
#define YYSTYPE std::string
...
%}

но тогда все переменные $1, $2, etc будут иметь тип string.
Если тебя это устраивает, то можно и так.

OldFatMan
()
Ответ на: комментарий от OldFatMan

Вдогонку:

При генерации выхода на С++ в y-файле нужны ещё соответствующие include-ы.
Подробности см. в info bison - раздел Other Languages.

OldFatMan
()
Ответ на: комментарий от LIKAN

А первый вариант? Я не вполне уверен, сам что-то подобное делал довольно-таки давно, сам помню смутно. Но вроде бы съедал bison такие спецификаторы типов для аргументов, не плевался.

OldFatMan
()
Ответ на: комментарий от Shimuuar

Можно запихнуть по указателю и освобождать память в случае неудачи. Но да, так логичнее в случае, если используется boost.

cattail
()
Ответ на: комментарий от cattail

Можно, но я развращён языками с суммами типов, а boost::variant лучшее что можно выжать из С++

Shimuuar
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.