【问题标题】:Why call yylex() only once in main()为什么在 main() 中只调用一次 yylex()
【发布时间】:2018-03-29 11:14:20
【问题描述】:

当我为 yacc 解析器编写 yylex() 时,yylex() 通常一次返回符号,即 yylex() 必须多次调用,直到文件结束。

但是当我为 lex 扫描器编写 main 函数时,我只调用了 yylex() 一次,但整个文件仍然被完全扫描。

void main(int argc, char* argv[]) {
    printf("start\n");
    yyin = fopen(argv[1], "r");
    yylex();
    printf("word count: %d\n", wordCount);
    fclose(yyin);
}

为什么?

【问题讨论】:

  • 没有程序和数据,没有人会给出有用的答案。
  • 这很大程度上取决于扫描仪定义中的操作是否包含return 命令。操作直接插入yylex
  • @rici 你说得对,yylex 控制流非常依赖于动作,我阅读了生成的代码,发现它只是将动作代码复制到 switch case 段。

标签: flex-lexer yacc lex


【解决方案1】:

抱歉问了一个愚蠢的问题,我已经阅读了 lex 生成的 c 文件,发现动作代码粘贴在 switch case 段中,所以,正如@rici 所说,这在很大程度上取决于你写的内容在操作中,由于我的操作代码没有返回,因此对 yylex 的调用将通过流。当有返回时,我应该使用 while() 来调用 yylex。

【讨论】:

    猜你喜欢
    • 2021-11-25
    相关资源
    最近更新 更多