【问题标题】:flex bison C lex yacc scanning string buffersflex bison C lex yacc 扫描字符串缓冲区
【发布时间】:2011-02-06 12:49:03
【问题描述】:

有一些类似的 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);
}

它在类似(伪代码)的循环中被调用:

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(当 flex 扫描仪看到 '\n' 时它会增加)并且它只增加一次,在第一个命令之后。

我无法确定是我在使用 flex 时做错了什么,还是 yyparse 在第一次运行后停止调用扫描仪。

如果有人能准确指出正在发生的事情,我会非常高兴。

【问题讨论】:

    标签: c yacc bison lex


    【解决方案1】:

    你能通过调试试试这个吗?检查读取了哪些令牌。是否及时切换,输入是什么。

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

    【讨论】:

    • 再次您好,谢谢您的回复并提示使用 yydebug。结果证明与 flex 或 yyparse 无关,这是我在循环中的字符串重置函数。它将 index-where-next-character-goes 重置为 0,但由于我的 string-add-character 的工作方式,它需要重置为 -1 ......所以我传递了一个以开头的字符串'\0' 到扫描仪,它显然没有工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2011-09-30
    • 2012-01-31
    • 1970-01-01
    • 2014-10-31
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多