flex bison C lex yacc扫描字符串缓冲区

时间:2011-02-06 12:49:03

标签: c yacc bison lex

有点像C代码:

int doCommand(char* command)
{
    // +2 on strlen is for the two extra '\0' characters
    // needed by flex when scanning strings.
    YY_BUFFER_STATE yybs = yy_scan_buffer(command, strlen(command)+2);
    yy_switch_to_buffer(yybs);
    yyparse();
    yy_delete_buffer(yybs);
}

它在一个循环中调用,如(psuedocode):

read characters upto and including '\n' into a buffer;
add two '\0' characters;
call doCommand(buffer);
zero the buffer; // NOTE: same buffer will be used next loop.

出现问题的是,第一个命令处理成功后,输入的任何其他命令都不会被处理。

我已经打印出 yylineno (当灵活扫描程序看到'\ n'时会增加),并且在第一个命令之后只会增加一次。

如果我在使用flex时出错,或者如果 yyparse 在第一次使用后停止调用扫描仪,我就无法解决。

如果有人能指出究竟发生了什么,我会非常高兴。

1 个答案:

答案 0 :(得分:2)

你能用调试试试吗?检查读取的令牌。它是否及时切换,输入是什么。

我不使用flex增强功能,因为我需要可移植性,所以我通过YY_INPUT实现这种机制有点不同。可能生成的令牌与您的预期不同,所以我建议先调试lex部分。