【发布时间】:2009-07-01 23:26:10
【问题描述】:
在我的 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 }
我尝试了几个人给出的建议,但仍然没有运气。这是我的完整 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);
}
【问题讨论】:
-
查看您的 lex 代码可能有助于尝试确定您的标记是否正确。如果您试图忽略空格,您是否为 RegEx [ \t\n] 添加了适当的规则? (如果需要,您也可以将 \r 放入其中。)更多信息可以帮助解决这个问题。
-
这个问题进展如何?
-
原来 ['"].*+['"] 规则使程序不愉快。我为 ARGUMENT(s) 重写了我的其他规则并删除了该规则,最终一切正常。仍然不太清楚为什么......
-
这条规则很奇怪,你匹配一个单引号或一个双引号 ['"] 然后匹配任何非换行符零次或多次 .* 但然后匹配前面的规则一次或多次+ 我认为这是你的错误,然后第一部分再次 ['"] 我想知道你是否删除了 + 或 * 你可能会得到更好的结果。另外我假设您希望在中间部分进行否定匹配,因为 .* 是贪婪匹配。所以我倾向于有两个匹配单引号和双引号的情况,比如 '[^']*' 和 "[^"]*"
-
好吧,我可以通过删除规则来解决它
标签: c++ bison flex-lexer