Frage

In meinem Bison / flex Programm, direkt nach yyparse () aufgerufen wird, wird ein führendes Register gedruckt, aber ich weiß nicht, warum. Können Sie sehen, was falsch ist?

Dies ruft den Bison-Code, und direkt nach yyparse () zurückkehrt, wird eine Registerkarte gedruckt.

void parseArguments(int argc, char** argv)
130 {
131     int i;
132 
133     int sum = 0;
134     // calculate the length of buffer we need
135     for(i = 1; i < argc; i++)
136     {
137         sum += strlen(argv[i]) + 1;
138     }
139 
140     if(sum <= 0)
141         return;
142 
143     // make us a buffer and zero it out
144     char tempBuffer[sum];
145     memset(tempBuffer, 0, sum);
146 
147     // pointer to walk through our buffer
148     int pos = 0;
149 
150     // copy arguments into the buffer
151     for(i = 1; i < argc; i++)
152     {
153         memcpy(tempBuffer+pos, argv[i], strlen(argv[i]));
154         pos += strlen(argv[i]);
155         sprintf(tempBuffer+pos++, " ");
156     }
157 
158     // give our arguments to lex for parsing
159     configBuffer(tempBuffer);
160 


// use bison parsing
163     int returnVal = yyparse(); // after this returns a tab character has been printed


164     if(returnVal != 0)                                                                                            
   165     {   
   166         printf("yyparse failed!\n");                                                                              
   167     }                                                                                                             
   168     

Alle meine Bison Regeln sind nur reguläre Ausdrücke mit einer return-Anweisung gepaart. Der einzige Code von Interesse in Bison, dass ich dies zu beeinflussen sehen könnte, wäre dies:

64 %%
 65 void configBuffer(char* arguments)
 66 {
 67 #ifdef DEBUG
 68     printf("Given the buffer: %s\n", arguments);
 69 #endif
 70     yy_delete_buffer(YY_CURRENT_BUFFER);
 71 
 72     yy_scan_string(arguments);
 73 }

Ich habe versucht, die von mehreren Personen gegeben Vorschläge, aber noch kein Glück. Hier ist meine volle flex-Datei:

%{
#include <string.h>
#include "CommandParser.tab.h"
%}

%%

\t {
    printf("TAB!\n");
}

" " {
    printf("SPACE!\n");
}

\n {
    return;
}

-p {
    return PRINTMODE; 
}

-x {
    return XORMODE;
}

-n {
    return NOTMODE;
}

-a {
    return ANDMODE;
}

-o {
    return ORMODE;
}

-r {
    return RANGEFLAG;
}

-l {
    return LENGTHFLAG;
}

0[xX][0-9a-fA-F]+ {
    int retVal = sscanf(yytext, "%x",&(yylval.int_val));
    if(retVal != 1)
        return;
    return NUMBER;
}

[0-9]+ {
    yylval.int_val = atoi(yytext);
    return NUMBER;
}

['"].*+['"] {
    yylval.string_val = strdup(yytext);
    return ARGUMENT;
}

[^ \t\n]+ {
    yylval.string_val = strdup(yytext);
    return ARGUMENT;
}


%%
void configBuffer(char* arguments)
{
#define DEBUG
#ifdef DEBUG
    printf("Given the buffer: %s:\n", arguments);
#endif
    yy_delete_buffer(YY_CURRENT_BUFFER);
    yy_scan_string(arguments);

}

War es hilfreich?

Lösung

Ist die Registerkarte nicht in Sie Lexer behandelt und damit die Standardregelanpassung und reflektierter angewendet wird?

Setzen Sie ein zusätzliches Spiel

\t { printf("TAB"); }

in den Code vor Ihrer End-Code-Seite.

Wenn das zeigt TAB anstelle des \ t, dann drehen Sie die printf in eine leere Anweisung

\t { /*printf("TAB")*/; }

Nach lex Beitrag Edit:

Ok, nach der lex Prüfung würde es scheinen Sie die Dinge richtig passen.

Ich habe diesen Code zu testen

#include <stdio.h>
#include "CommandParser.tab.h"

YYSTYPE yylval;

int main(int argc, char* argv[])
{
    while(1)
    {
        printf("lex:%d\r\n",yylex());
    }
    return 0;
}

extern "C" int yywrap();

int yywrap ()
{
    return 1;
}

So mit dem Eingang (via stdin)

-a<\ >-x<\t>-p<space>-c<\r>

ich

lex:103
SPACE!
lex:101
TAB!
lex:100
SPACE!
lex:108
lex:3

für diese Header-Datei

#define PRINTMODE   100
#define XORMODE     101
#define NOTMODE     102
#define ANDMODE     103
#define ORMODE      104
#define LENGTHFLAG  105
#define RANGEFLAG   106
#define NUMBER      107
#define ARGUMENT    108
#define DEFUALT     0

typedef union {
    int int_val;
    char* string_val;
} YYSTYPE;

#ifdef __cplusplus
extern "C" int yylex();

extern "C" YYSTYPE yylval;
#else // __cplusplus
extern YYSTYPE yylval;
#endif // __cplusplus

Also, was ich würde versuchen, nächstes ist die yyparse mit diesem Code ersetzen und sehen, was Sie erhalten.

while(1)
{
    printf("lex:%d\r\n",yylex());
}

Wenn Sie immer noch die Nase bekommen gedruckt ist es irgendwie Sie Lexer, sonst ist es irgendwie Ihre Parser / Hauptprogramm zurück.

Um das zu erfahren, ich die magischen String Gebäude ersetzen würde Sie mit einem const string tun, und sehe, was in diesem Fall passieren. Grundsätzlich binäre Suche Ihr Code das Problem vor Ort zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top