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

Bison input()和unput()是什么意思?,bison,flex-lexer,Bison,Flex Lexer,通过阅读使用flex和bison的“解析SQL”,我很难理解以下代码片段。我是flex和bison工具的新手,不明白这段代码与sql中的COUNT()函数有什么关系。input()和unput()在这里做什么?同一页面中的另一个函数SUBSTR(ING)?/“({return FSUBSTRING},ING是什么意思?整件事是否意味着它匹配零或SUBSTR(ING)中的一个,并后跟(或“(”,哪一个) /* check trailing context manually */ COUNT

通过阅读使用flex和bison的“解析SQL”,我很难理解以下代码片段。我是flex和bison工具的新手,不明白这段代码与sql中的COUNT()函数有什么关系。input()和unput()在这里做什么?同一页面中的另一个函数SUBSTR(ING)?/“({return FSUBSTRING},ING是什么意思?整件事是否意味着它匹配零或SUBSTR(ING)中的一个,并后跟(或“(”,哪一个)

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

针对您的具体问题:

  • input()
    从输入流中读取下一个字符
  • unput(ch)
    将字符
    ch
    放回输入流
这些函数实际上相当于标准C库函数
getc(yyin)
ungect(ch,yyin)
,除了
flex
内部缓冲区
yyin
,因此必须使用flex的内部函数

  • SUBSTR(ING)?/”(“
    是一个(f)lex风格的正则表达式。括号和问号是正常的正则表达式运算符,与任何其他正则表达式方言一样,因此在这一点上它的意思是“单词
    SUBSTR
    或单词
    SUBSTRING
    ”。运算符是特定于flex的:它指定了尾随上下文,与Perl正则表达式中的前瞻断言类似,只是在flex中它不能在正则表达式中使用。引号也是特定于flex的:它们围绕着文本,因此
    表示“文本(”。因此,如果紧跟着一个开括号,则整个正则表达式将匹配单词
    SUBSTR
    或单词
    SUBSTRING
如果你想学习flex和bison,John Levine的书是一本很好的资源。但是,你应该从头开始,通读到最后