`ss`在哪里将flex输入设置为来自命令行参数?

时间:2019-02-08 20:58:17

标签: bison flex-lexer iproute

我听说ss uses Bison to parse command line arguments。野牛从输出Flex获取输入。 Flex默认情况下从stdin接受输入。 ss在哪里将flex输入设置为来自命令行参数?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

yylex()还必须:

  • 如果令牌具有语义值,则将令牌的语义值保存在全局变量yylval中;否则,将令牌的语义值保存在全局变量yylloc中。和

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

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

许多工具,包括ss,都将野牛与手工编码的词法分析器一起使用。因此,您的问题的答案是flex从未设置flex输入,因为它不使用flex。 (事实上​​,这不一定使它成为一个好主意。许多手写扫描仪的速度明显慢于yyparse,并且代码冗长且难以推理。)


其他界面

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

  • 如果您的yylex实现需要其他数据,则可以定义yyparse()来接受其他参数。通常,这些附加参数将提供给yylex(),以便解析器可以在对yylex的调用中使用它们。请参见bison manual section on the %param directive

  • 您可以告诉bison生成不依赖于全局变量的纯解析器,在这种情况下,它将使用指向语义对象的指针调用{{1}},并且如果使用了位置信息,指向位置对象的指针。请参见bison manual chapter on pure parser interface

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