我听说ss
uses Bison to parse command line arguments。野牛从输出Flex获取输入。 Flex默认情况下从stdin接受输入。 ss
在哪里将flex输入设置为来自命令行参数?
谢谢。
答案 0 :(得分:1)
野牛在需要令牌时会调用yylex()
。 yylex()
的返回值是一个小整数,它是在野牛语法中用%token
声明的枚举常数之一,或者是0以外的字符常数,或0表示EOF。>
yylex()
还必须:
如果令牌具有语义值,则将令牌的语义值保存在全局变量yylval
中;否则,将令牌的语义值保存在全局变量yylloc
中。和
如果解析器操作使用位置信息,则将令牌的位置保存在全局变量flex
中的输入流中。
您可以使用yylex()
命令行工具构建扫描仪。但是您没有义务这样做。您可以使用其他工具来生成扫描仪。或者,您可以自己定义一个ss
函数。扫描仪的界面已尽可能简化,以简化实现。
许多工具,包括ss
,都将野牛与手工编码的词法分析器一起使用。因此,您的问题的答案是flex
从未设置flex输入,因为它不使用flex。 (事实上,这不一定使它成为一个好主意。许多手写扫描仪的速度明显慢于yyparse
,并且代码冗长且难以推理。)
以上是yylex
和yylex
之间的默认接口。还有其他选择:
如果您的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。