如何识别yacc中的非保留关键字?

时间:2015-12-18 17:22:54

标签: sql grammar yacc lex

我正在编写一个SQL语法,这个语法大部分都很简单,但在为CASE语句编写规则时遇到了麻烦。

如果CASE和WHEN是SQL语言中保留的令牌,那将是微不足道的,但事实并非如此。两者都可以用作列名,别名等的普通标识符。

我考虑使用lex来确定它是否应该返回CASE或IDENTIFIER令牌,但我无法弄清楚如何做到这一点。如果可能的话,规则会非常复杂。

与此同时,我不知道是否甚至可以编写一个非终端规则,该规则在规则本身中使用IDENTIFIER标记的值(而不是动作)。

我知道它可能已经由Oracle的解析器完成(虽然现在我考虑过它们可能没有使用lex / yacc)。

编辑: 我可以假设CASE是一个关键字并将其作为令牌返回,但是如果当前规则失败,则将其推回到lex并让它返回CASE作为IDENTIFIER,其值为“CASE”?

我很高兴知道语句的语法是正确的(已经在工作的查询),所以如果CASE规则失败,我知道它是一个IDENTIFIER。

如果lex和yacc不能这样做,可以弯曲和野牛?

0 个答案:

没有答案