【发布时间】:2019-02-08 20:58:16
【问题描述】:
我听说ss uses Bison to parse command line arguments。 Bison 从输出 Flex 中获取输入。 Flex 默认从标准输入获取输入。 ss 在哪里设置 flex 输入来自命令行参数?
【问题讨论】:
标签: bison flex-lexer iproute
我听说ss uses Bison to parse command line arguments。 Bison 从输出 Flex 中获取输入。 Flex 默认从标准输入获取输入。 ss 在哪里设置 flex 输入来自命令行参数?
【问题讨论】:
标签: bison flex-lexer iproute
Bison 在需要令牌时调用yylex()。 yylex()的返回值是一个小整数,可以是bison语法中%token声明的枚举常量之一,也可以是0以外的字符常量,或者0表示EOF。
yylex() 还必须:
如果token有语义值,则将token的语义值保存在全局变量yylval中;和
如果解析器操作使用位置信息,则将令牌的位置保存在全局变量 yylloc 的输入流中。
您可以使用flex 命令行工具构建扫描仪。但您没有义务这样做。您可以使用不同的工具来生成扫描仪。或者您可以自己定义一个yylex() 函数。扫描仪的界面已尽可能简单以简化实施。
包括ss 在内的许多工具都将bison 与手动编码的词法分析器结合使用。所以你的问题的答案是ss 从不设置 flex 输入,因为它不使用 flex。 (虽然这是可能的,但这并不一定是个好主意。许多手写扫描仪比flex 慢得多,而且代码冗长且难以推理。)
以上是yyparse和yylex之间的默认接口。还有其他选择:
如果您的 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。
【讨论】: