【问题标题】:Where does `ss` set up flex input to come from command line arguments?`ss` 在哪里设置 flex 输入以来自命令行参数?
【发布时间】:2019-02-08 20:58:16
【问题描述】:

我听说ss uses Bison to parse command line arguments。 Bison 从输出 Flex 中获取输入。 Flex 默认从标准输入获取输入。 ss 在哪里设置 flex 输入来自命令行参数?

【问题讨论】:

    标签: bison flex-lexer iproute


    【解决方案1】:

    Bison 在需要令牌时调用yylex()yylex()的返回值是一个小整数,可以是bison语法中%token声明的枚举常量之一,也可以是0以外的字符常量,或者0表示EOF。

    yylex() 还必须:

    • 如果token有语义值,则将token的语义值保存在全局变量yylval中;和

    • 如果解析器操作使用位置信息,则将令牌的位置保存在全局变量 yylloc 的输入流中。

    您可以使用flex 命令行工具构建扫描仪。但您没有义务这样做。您可以使用不同的工具来生成扫描仪。或者您可以自己定义一个yylex() 函数。扫描仪的界面已尽可能简单以简化实施。

    包括ss 在内的许多工具都将bison 与手动编码的词法分析器结合使用。所以你的问题的答案是ss 从不设置 flex 输入,因为它不使用 flex。 (虽然这是可能的,但这并不一定是个好主意。许多手写扫描仪比flex 慢得多,而且代码冗长且难以推理。)


    其他接口

    以上是yyparseyylex之间的默认接口。还有其他选择:

    • 如果您的 yylex 实现需要额外的数据,您可以定义 yylex 来获取额外的参数。通常,这些附加参数将提供给yyparse(),以便解析器可以在调用yylex() 时使用它们。请参阅bison manual section on the %param directive

    • 您可以告诉 bison 生成一个不依赖全局变量的纯解析器,在这种情况下,它将调用 yylex 并带有指向语义对象的指针,如果使用位置信息,则使用指向位置对象的指针.请参阅bison manual chapter on pure parser interface

    • 您可以请求“推送解析器”,每次令牌可用时扫描器都会调用该解析器。请参阅bison manual chapter on push parsers

    【讨论】:

      猜你喜欢
      • 2016-05-06
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      相关资源
      最近更新 更多