yyparse druckt eine führende Lasche
-
21-08-2019 - |
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);
}
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.