我有问题要通过使用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; }
答案 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的书是一本很好的资源。但是,你应该从一开始就开始阅读直到结束。