【问题标题】:loading external files flex bison - yyin?加载外部文件 flex bison - yyin?
【发布时间】:2015-10-28 15:45:12
【问题描述】:

我正在用 flex + bison 编写一种基本语言,用于我自己的个人研究/运行简单的脚本以获得乐趣。

它通过命令行获取用户输入,对其进行解析并执行所需的结果。我想添加功能加载文件。

例如,当“加载文件'somefile.src'”文件被加载并自动解析时,解析器切换回等待命令行输入。

我无法理解文档,并且非常迷茫。作为一个整体,我对 flex、bison 和 C 不熟悉,这无济于事。

我正在关注这个 pdf:http://epaperpress.com/lexandyacc/(使用复杂的计算器作为骨架并在其上添加功能)以及查看野牛文档 http://www.gnu.org/software/bison/manual/bison.html

任何建议将不胜感激。

【问题讨论】:

    标签: c bison flex-lexer


    【解决方案1】:

    输入处理由 flex 完成,因此您需要阅读flex manual 了解详细信息。

    关于多个输入缓冲区的部分(上面链接)包含用于处理类似“包含”的构造的示例代码。实际上,有两个示例实现;一个使用内置缓冲堆栈(推荐),另一个使用显式缓冲堆栈。

    真的,这不是很复杂。要开始读取新文件,您需要做的就是:

    yyin = fopen(filename, "r");
    if ( !yyin ) /* Handle the error */
    yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
    

    您在 EOF 规则中弹出缓冲区状态:

    <<EOF>> { yypop_buffer_state();
              /* Make sure we stop if the EOF is the original input. */
              if (!YY_CURRENT_BUFFER) { yyterminate(); }
            }
    

    【讨论】:

    • 根据另一位用户的评论,yy_create_buffer函数需要三个参数,但给出了两个参数 ...看来你的答案是错误的,还是不完整的?跨度>
    • @ghostcat:yy_create_buffer 函数记录在答案的链接中,因此很容易验证调用是否正确。如果您请求重入扫描器,那么所有 API(包括 yypush_buffer_stateyypop_buffer_state)都需要一个额外的参数。但是,此问题中没有任何内容表明正在请求非标准扫描仪。
    猜你喜欢
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多