6
votes

I have this token in my .lex file:

[a-zA-Z0-9]+    { yylval = yytext; return ALPHANUM; }

and this code in my .y file:

Sentence: "Sphere(" ALPHANUM ")."
{
FILE* file = fopen("C:/test.txt", "a+");
char st1[] = "polySphere -name ";
strcat(st1, $2);
strcat(st1, ";");
fprintf(file,"%s", st1);
fclose(file);
}

I get this error when I try to compile:

warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast

So $2 is an int, how do I make it a string?

For example: "Sphere(worldGlobe)." I want $2 to have the string value worldGlobe here.

Thanks for any help

1
Can you show us your union declaration from the .y file and your token declaration for ALPHANUM from the .y file?MtnViewJohn
Assuming you have multiple yylval types. If all you ever return is char* then you should have #define YYSTYPE char* in the prologue part of the .y file.MtnViewJohn

1 Answers

10
votes

In the absence of a %union declaration, bison defines YYSTYPE to be int, so all of the symbol values are integers. In fact you have a few solutions for this problem:

1) yylval|union solution (RECOMMENDED):
As you may know yylval is a global variable used by the lexer to store yytext variable (yylval = yytext;) so you should tell your lexer which types you would to store.you can simply add this line to the header of your YACC grammar:

#define YYSTYPE char *

you will store here only string values.

By the way if you want to store different types you should specify in your yacc file:

%union {
    char *a;
    double d;
    int fn;
}

then in your lex you will have

[a-zA-Z0-9]+    { **yylval.a** = yytext; return ALPHANUM; }

2) Using yytext:

Advice: for callbacks after rules in yacc i,personally prefer to use functions. not the whole code as you do :)

this solution is really simple .
Sentence: "Sphere("{callback_your_function(yytext);} ALPHANUM ")."

the yytext here will have the value of your ALPHANUM token because it's the next token.