2009-07-01 3 views
0

내 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); 

}

+0

lex 코드를 보는 것은 올바르게 토큰 화하는 경우에 유용합니다. 공백을 무시하려는 경우 RegEx [\ t \ n]에 적합한 규칙을 추가 했습니까? (필요하다면 그걸 던져 줄 수도 있습니다.) 조금 더 많은 정보가이 문제를 해결하는 데 도움이 될 수 있습니다. –

+0

어떻게이 문제가 진행됩니까? –

+0

[ ' "] * + ['"] 규칙으로 인해 프로그램이 불만을 나타 냈습니다. 나는 ARGUMENT (s)에 대한 다른 규칙을 다시 작성하고 그 규칙을 삭제했다. 모든 것이 잘 풀렸다. 아직 확실하지 않은 이유는 무엇입니까? – samoz

답변

5

이 탭을 사용하면 렉서에서 처리되지 따라서 기본 규칙 매칭 및 에코가 적용되고 있습니다 : 여기에 내 전체 플렉스 파일은?

는 최종 코드 섹션 전에 코드에 추가 일치

\t { printf("TAB"); } 

를 넣습니다.

그 대신 \의 t의 탭을 보여줍니다 경우, 다음 빈 문에의 printf를 설정

렉스 게시 편집 후
\t { /*printf("TAB")*/; } 

:

좋아, 당신 렉스 테스트 후 당신을 보일 수있을 것입니다 일들이 정확하게 일치하고 있습니다.

나는 (표준 입력을 통해) 입력

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

내가이 헤더 파일

#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 
에 대한

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

얻을로 그것을 그래서

#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; 
} 

을 테스트하려면이 코드를 사용

그래서 다음은이 코드로 yyparse을 대체하고 얻은 결과를 확인해 보는 것입니다. 당신은 여전히 ​​탭이 어떻게 든 당신 렉서입니다 인쇄되는 경우

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

, 그렇지 않으면 그것은 어떻게 든 파서/주요 프로그램입니다.

당신이 const string으로 작성한 마법의 문자열을 대체하고, 그 경우에 어떤 일이 일어나는지 알아보십시오. 기본적으로 이진 코드를 검색하여 문제 지점을 찾습니다.

관련 문제