2016-04-14 8 views
0
%option case-insensitive 
%option noyywrap 
%option yylineno 


id    [a-zA-Z][a-zA-Z_0-9]* 

integer   (0[xX][0-9A-Fa-f]+)|([0-9]+) 

real   [0-9]*\.[0-9](e|E)?[0-9]* 

undefined  [^"\r\n \t] 

%x STR 
%% 
\" string_buf_ptr = string_buf; BEGIN(STR); 

<STR>\"  { /* saw closing quote - all done */ 
    BEGIN(INITIAL); 
    *string_buf_ptr = '\0'; 
    /* return string constant token type and 
    * value to parser 
    */ 

    yylval.strVal = strdup(string_buf); 
    sprintf(yyout, yylval.strVal); 
    return STR; 
    } 

<STR>\\n *string_buf_ptr++ = '\n'; 
<STR>\\t *string_buf_ptr++ = '\t'; 
<STR>\\r *string_buf_ptr++ = '\r'; 
<STR>\\b *string_buf_ptr++ = '\b'; 
<STR>\\f *string_buf_ptr++ = '\f'; 

<STR>\\(.|\n) *string_buf_ptr++ = yytext[1]; 

<STR>[^\\\n\"]+  { 
    char *yptr = yytext; 

    while (*yptr) 
      *string_buf_ptr++ = *yptr++; 
    } 

Dies ist Teil meines Codes für die lexikalische Analyse von Strings. Das Ziel dieses Codes ist es, Strings (C-ähnliche Strings z. B. "Hello World") zu lokalisieren und sie zur Bearbeitung an unseren Parser zurückzugeben.Parse-Fehler beim Umgang mit Strings

Ich habe konstruiert auch einen Parser das Yacc Tool und es ist fast perfekt außer aus, wenn wir die Zuordnung Strings Variablen (ex. x="Hello World";) Wenn ich das tue, die yyerror(const char*) Funktion aufgerufen wird und die Nachricht ist unexpected $undefined. I kann nicht verstehen, warum das passiert. Die Reduzierung sollte eine left valuex, eine assignment und eine constant String"Hello World" erkennen, was mache ich falsch?

Antwort

2

Das Problem ist, dass Sie STR als einen Token und einen Lex-Startzustand offenbar definiert haben. Bei beiden handelt es sich tatsächlich um Makros (die sich zu ganzzahligen Konstantenliteralen erweitern). Wahrscheinlich haben Sie also eine Warnung darüber, dass das Makro STR irgendwo in Ihrer Compilerausgabe neu definiert wird. Die return STR; in Ihrem Code oben endet mit der Rückgabe des Startzustandscode für STR anstelle des Token-Codes, die der Bison-generierte Parser nicht als gültigen Token-Code erkennt.

+0

danke! Das war's! – Jack