2009-07-01 12 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  

すべての私のバイソンルールは、リターンステートメントとペアになった単なる正規表現です。

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

正しくトークン化しているかどうか調べるには、レックスコードを見てみてください。空白を無視しようとしている場合は、RegEx [\ t \ n]の適切なルールを追加しましたか? (必要に応じてこれに\ rを含めることもできます) もう少し情報があれば、この問題を解決するのに役立ちます。 –

+0

どうすればこの問題が進んでいますか? –

+0

['"]。* + ['"]ルールがプログラムを不幸にしていたことが判明しました。私はARGUMENTのための私の他のルールを書き直し、そのルールを削除し、すべてうまくいった。しかし、あまりにも確かではありません... – samoz

答えて

5

取り扱いしておりませんので、デフォルトのルール・マッチングとエコーが適用されていますか?

は、あなたの最後のコードセクションの前にコードに余分な試合

\t { printf("TAB"); } 

を入れてください。

その代わりに、\ tのTABを示している場合は、空のステートメントにprintf関数を回す

lexの投稿を編集した後
\t { /*printf("TAB")*/; } 

[OK]を、あなたのlexをテストした後、それはあなたを思わ物事が正しく一致している。

私はこのヘッダーファイル

#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 

を取得

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

(STDINを介して)入力してだから

#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であなたが行う魔法の弦の代わりにそれを見つけることができます、そしてその場合はどうなるか見てください。基本的にバイナリでコードを検索し、問題のある箇所を見つけます。

関連する問題