문제

내 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, 그 경우 무슨 일이 일어나는지 확인하십시오. 기본적으로 이진 코드를 검색하여 문제점을 찾으십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top