input()和unput()是什么意思?

时间:2015-07-25 21:59:56

标签: bison flex-lexer

我有问题要通过使用flex和bison - https://www.safaribooksonline.com/library/view/flex-bison/9780596805418/ch04.html来阅读“解析SQL”来理解以下代码段代码。我是flex和bison工具的新手,不明白这段代码是如何与sql中的COUNT()函数相关的。 input()和unput()在这里做什么?同一页SUBSTR(ING)中的另一个函数?/“(”{返回FSUBSTRING},ING是什么意思?整个意思是它匹配零或一个SUBSTR(ING)并跟着(或“(”,哪一个?

/* check trailing context manually */
COUNT    { int c = input(); unput(c);
       if(c == '(') return FCOUNT;
       yylval.strval = strdup(yytext);
       return NAME; }

1 个答案:

答案 0 :(得分:3)

回答您的具体问题:

  • input()从输入流中读取下一个字符。
  • unput(ch)将字符ch放回输入流。

这些有效地等同于标准C库函数getc(yyin)ungetc(ch, yyin),除了flex内部缓冲yyin,因此您必须使用flex' s内部职能。

  • SUBSTR(ING)?/"("是(f)lex风格的正则表达式。括号和问号是正常的正则表达式算子,就像其他任何正则表达式方言一样,所以在这一点上它意味着"单词SUBSTR或单词SUBSTRING" 。 / 运算符是特定于flex的:它指定尾随上下文,而不像Perl正则表达式中的超前断言,除了在flex中它不能在正则表达式中使用。引号也是特定于flex的:它们包含文字文本,因此"("表示"文字"。因此整个正则表达式将与单词匹配SUBSTR或单词SUBSTRING如果紧跟一个左括号。

如果你想学习弹性和野牛,John Levine的书是一本很好的资源。但是,你应该从一开始就开始阅读直到结束。