내 bison/flex 프로그램에서 yyparse()가 호출 된 직후 선행 탭이 인쇄되었지만 그 이유는 모르겠습니다. 무엇이 잘못되었는지 보시겠습니까?yyparse가 선행 탭을 인쇄하고 있습니다
이 코드는 bison 코드를 호출하고 yyparse()가 반환 된 직후에 탭이 인쇄됩니다.
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
내 모든 들소 규칙은 return 문과 쌍을 이루는 정규 표현식입니다.
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 }
내가 여러 사람에 의해 주어진 제안을했지만, 아직도 운 :이 영향을 볼 수 있었다 들소에 대한 관심의 유일한 코드는이 될 것입니다.
%{
#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);
}
lex 코드를 보는 것은 올바르게 토큰 화하는 경우에 유용합니다. 공백을 무시하려는 경우 RegEx [\ t \ n]에 적합한 규칙을 추가 했습니까? (필요하다면 그걸 던져 줄 수도 있습니다.) 조금 더 많은 정보가이 문제를 해결하는 데 도움이 될 수 있습니다. –
어떻게이 문제가 진행됩니까? –
[ ' "] * + ['"] 규칙으로 인해 프로그램이 불만을 나타 냈습니다. 나는 ARGUMENT (s)에 대한 다른 규칙을 다시 작성하고 그 규칙을 삭제했다. 모든 것이 잘 풀렸다. 아직 확실하지 않은 이유는 무엇입니까? – samoz