Yyparse는 선행 탭을 인쇄하고 있습니다
-
21-08-2019 - |
문제
내 Bison/Flex 프로그램에서 yyparse ()가 호출 된 직후에 선행 탭이 인쇄되지만 그 이유를 모르겠습니다. 무엇이 잘못되었는지 알 수 있습니까?
이것은 들소 코드를 호출하고 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
내 모든 들소 규칙은 정규 표현식입니다. 내가 이것에 영향을 줄 수있는 들소에 대한 유일한 관심 강령은 다음과 같습니다.
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 }
나는 여러 사람이 제공 한 제안을 시도했지만 여전히 운이 좋지 않았습니다. 다음은 내 Full Flex 파일입니다.
%{
#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);
}
해결책
Lexer에서 탭이 처리되지 않으므로 기본 규칙 일치 및 에코가 적용되고 있습니까?
추가 일치를하십시오
\t { printf("TAB"); }
최종 코드 섹션 이전의 코드로.
그것이 t 대신 탭을 보여 주면 printf를 빈 문으로 바꿉니다.
\t { /*printf("TAB")*/; }
Lex 게시 후 편집 후 :
좋아, Lex를 테스트 한 후에는 올바르게 일치하는 것 같습니다.
이 코드를 사용하여 테스트했습니다
#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;
}
그래서 입력으로 (Stdin을 통해)
-a<\ >-x<\t>-p<space>-c<\r>
나는 얻다
lex:103
SPACE!
lex:101
TAB!
lex:100
SPACE!
lex:108
lex:3
이 헤더 파일의 경우
#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
그래서 다음에 시도하는 것은 교체입니다 yyparse
이 코드로 무엇을 얻는 지 확인하십시오.
while(1)
{
printf("lex:%d\r\n",yylex());
}
여전히 탭을 인쇄하면 어떻게 든 Lexer입니다. 그렇지 않으면 파서/메인 프로그램입니다.
내가 당신이하는 마법의 현악 건물을 대체한다는 것을 알기 위해 const string
, 그 경우 무슨 일이 일어나는지 확인하십시오. 기본적으로 이진 코드를 검색하여 문제점을 찾으십시오.
제휴하지 않습니다 StackOverflow