Bison input()和unput()是什么意思?
通过阅读使用flex和bison的“解析SQL”,我很难理解以下代码片段。我是flex和bison工具的新手,不明白这段代码与sql中的COUNT()函数有什么关系。input()和unput()在这里做什么?同一页面中的另一个函数SUBSTR(ING)?/“({return FSUBSTRING},ING是什么意思?整件事是否意味着它匹配零或SUBSTR(ING)中的一个,并后跟(或“(”,哪一个)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
/* check trailing context manually */
COUNT { int c = input(); unput(c);
if(c == '(') return FCOUNT;
yylval.strval = strdup(yytext);
return NAME; }
针对您的具体问题:
从输入流中读取下一个字符input()
将字符unput(ch)
放回输入流ch
getc(yyin)
和ungect(ch,yyin)
,除了flex
内部缓冲区yyin
,因此必须使用flex的内部函数
是一个(f)lex风格的正则表达式。括号和问号是正常的正则表达式运算符,与任何其他正则表达式方言一样,因此在这一点上它的意思是“单词SUBSTR(ING)?/”(“
或单词SUBSTR
”。运算符是特定于flex的:它指定了尾随上下文,与Perl正则表达式中的前瞻断言类似,只是在flex中它不能在正则表达式中使用。引号也是特定于flex的:它们围绕着文本,因此SUBSTRING
表示“文本(”。因此,如果紧跟着一个开括号,则整个正则表达式将匹配单词(
或单词SUBSTR
SUBSTRING