我听说ss
使用 Bison 来解析命令行参数。Bison 从输出 Flex 中获取输入。Flex 默认从标准输入获取输入。在哪里ss
设置 flex 输入来自命令行参数?
1 回答
Bisonyylex()
会在需要令牌时调用。的返回值yylex()
是一个小整数,可以是%token
bison语法中用with声明的枚举常量之一,也可以是0以外的字符常量,或者0表示EOF。
yylex()
还必须:
yylval
如果令牌有语义值,则将令牌的语义值保存在全局变量中;和yylloc
如果解析器操作使用位置信息,则将令牌的位置保存在全局变量中的输入流中。
flex
您可以使用命令行工具构建扫描仪。但您没有义务这样做。您可以使用不同的工具来生成扫描仪。或者你可以yylex()
自己定义一个函数。扫描仪的界面尽可能简单,以简化实施。
许多工具,包括ss
,将野牛与手动编码的词法分析器一起使用。因此,您的问题的答案是ss
永远不会设置 flex 输入,因为它不使用 flex。(这可能的事实并不一定是一个好主意。许多手写扫描仪比 慢得多flex
,而且代码冗长且难以推理。)
其他接口
yyparse
以上是和之间的默认接口yylex
。有替代方案:
如果您的实现需要额外的数据,您可以定义
yylex
采用额外的参数。yylex
通常,将提供这些附加参数,yyparse()
以便解析器可以在调用yylex()
. 请参阅该指令的野牛手册部分%param
。您可以告诉 bison 生成一个不依赖全局变量的纯解析器,在这种情况下,它将
yylex
使用指向语义对象的指针进行调用,如果使用位置信息,则使用指向位置对象的指针。请参阅纯解析器接口的野牛手册章节。您可以请求“推送解析器”,每次令牌可用时扫描器都会调用该解析器。请参阅有关推送解析器的野牛手册章节。