2009-11-22 19 views
5

Necesito usar flex y bison para analizar algún código.bison YYSTYPE: tratando de usar char *

El tipo predeterminado de YYSTYPE es int, aunque nunca lo haya declarado así. ¿Es eso un defecto de bison?

Me ayudaría mucho pasar cadenas de nuevo. Leí esto: How to solve Bison warning "... has no declared type" Parece un buen enfoque. (Todavía no necesito todo el poder de una unión, solo la parte char *, pero también podría usar la unión porque podría ser útil más adelante).

No funciona para mí. Me sale estos errores:

y:111.37-38: $1 of `ConstExpression' has no declared type 
y:113.34-35: $1 of `ConstFactor' has no declared type 
y:114.35-36: $1 of `ConstFactor' has no declared type 
y:119.34-35: $1 of `Type' has no declared type 
y:109.23-48: warning: type clash on default action: <str> != <> 
y:115.23-27: warning: type clash on default action: <str> != <> 
[...more of the same snipped...] 

Estas son las declaraciones de mi archivo y gramática:

%union { 
    char *str; 
} 

%type<str> ConstExpression ConstFactor Type 

Aquí es una línea de mi archivo .l:

[a-zA-Z]+[a-zA-Z0-9]* { yylval.str = strdup(yytext); return yident;} 

¿Qué más necesito Qué hacer para resolver los errores?

+1

¿crees en serio la gente puede depurar el archivo de gramática sin verlo ? –

+6

@Kinopiko, ¿en serio lo rechazaste porque no se limitó a pegar toda su tarea y decir "Muéstrame el código"? ¿Te habría matado haber dicho "Necesito más información, publique el archivo completo de la gramática" o algo así? – steveha

+1

@Kinopiko, cuando publique la información que ha solicitado, ¿podrá deshacer su voto? Eso solo parece duro. – steveha

Respuesta

6

En realidad, estoy bastante seguro de que sé lo que está mal sin ver la gramática.

También es necesario declarar los tipos de símbolos de terminal, ya que a menudo pueden devolver el valor semántico. Piense en cosas como ID y NUMBER, que tienen datos de yyval. Pero yacc no tiene forma de saber si es solo un 'x' o algo más, y la acción predeterminada en una regla es: $$ = $1

Por ejemplo, la siguiente gramática lo hace muy bien, pero intente eliminar uno más más de los símbolos de la %type a continuación:

%union { 
    char *s; 
} 

%type <s> r1 r2 'x' 

%% 

r1: r2; 

r2: 'x' { printf("%s\n", $1); }; 
3

es probable que sólo necesita definir los tipos de sus fichas en el archivo de yacc

%token<str> yident 
+0

Creo que esto es correcto: si devuelve un char * en el archivo lex, no usa% type, que es para bisonte tipos ... – alternative