我听到了 ss uses Bison to parse command line arguments . Bison从output Flex获取输入。默认情况下,Flex从stdin获取输入。在哪里 党卫军 将flex输入设置为来自命令行参数?
ss
党卫军
野牛叫声 yylex() 无论何时它需要一个标记。的返回值 yylex() 是一个小整数,它是用 %token 在野牛语法中,或除0以外的字符常数,或表示EOF的0。
yylex()
%token
yylex() 还必须:
将标记的语义值保存在全局变量中 yylval ,如果令牌具有语义值;并且
yylval
在全局变量的输入流中保存标记的位置 yylloc ,如果解析器操作使用位置信息。
yylloc
您可以使用 flex 命令行工具。但你没有义务这么做。您可以使用其他工具生成扫描仪。或者你可以定义 yylex() 发挥你自己的作用。扫描器的接口尽可能简单,以简化实现。
flex
许多工具,包括 ss 使用一个手工编码的词法分析器。所以你的问题的答案是 党卫军 永远不要设置flex输入,因为它不使用flex。(事实上,这是可能的并不一定使它成为一个好主意。许多手写扫描器比 弯曲 ,而且代码冗长且难以解释。)
弯曲
以上是 yyparse 和 yylex . 还有其他选择:
yyparse
yylex
你可以定义 伊莱克斯 如果 伊莱克斯 实现需要额外的数据。通常,这些附加参数将提供给 yyparse() 以便解析器可以在调用 yylex() . 见 bison manual section on the %param directive .
伊莱克斯
yyparse()
%param
您可以告诉bison生成一个不依赖全局变量的纯解析器,在这种情况下,它将调用 伊莱克斯 使用指向语义对象的指针,如果使用位置信息,则使用指向位置对象的指针。见 bison manual chapter on pure parser interface .
您可以请求一个“推送解析器”,每当令牌可用时,扫描仪都会调用该解析器。见 bison manual chapter on push parsers .