0

我听说ss使用 Bison 来解析命令行参数。Bison 从输出 Flex 中获取输入。Flex 默认从标准输入获取输入。在哪里ss设置 flex 输入来自命令行参数?

4

1 回答 1

1

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

yylex()还必须:

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

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

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

许多工具,包括ss,将野牛与手动编码的词法分析器一起使用。因此,您的问题的答案是ss永远不会设置 flex 输入,因为它不使用 flex。(这可能的事实并不一定是一个好主意。许多手写扫描仪比 慢得多flex,而且代码冗长且难以推理。)


其他接口

yyparse以上是和之间的默认接口yylex。有替代方案:

  • 如果您的实现需要额外的数据,您可以定义yylex采用额外的参数。yylex通常,将提供这些附加参数,yyparse()以便解析器可以在调用yylex(). 请参阅该指令的野牛手册部分%param

  • 您可以告诉 bison 生成一个不依赖全局变量的纯解析器,在这种情况下,它将yylex使用指向语义对象的指针进行调用,如果使用位置信息,则使用指向位置对象的指针。请参阅纯解析器接口的野牛手册章节

  • 您可以请求“推送解析器”,每次令牌可用时扫描器都会调用该解析器。请参阅有关推送解析器的野牛手册章节

于 2019-02-09T06:18:06.033 回答