gpt4 book ai didi

sql - yacc/lex 上的先前标记

转载 作者:太空宇宙 更新时间:2023-11-04 07:21:12 25 4
gpt4 key购买 nike

我正在编写一些 SQL 操作代码,我正在使用这篇文章中链接的语言定义:SQL lex yacc grammar

我看到当我尝试调用一个函数来检测插入语句的表名时,我在 yytext 上得到了以下标记。我的代码这样调用该函数:

insert_statement:
INSERT INTO table opt_column_commalist values_or_query_spec
;
[..]
table:
NAME {setGlobalTablename(yytext);}
| NAME '.' NAME
;
[..]

当我使用这样的有效查询运行它时:

INSERT INTO users (uid,username,ocupation,age) VALUES (1,'john','tech','30');

我在 yytext 值中调用的函数中得到的标记是 '('。

据我所知,要得出 token 是表的结论,它必须读取下一个 token (在本例中为“(”),但我不知道如何获取真实的表名(用户)。事实上, 它不是前一个标记,而是前两个标记,因为空格也被认为是一个标记。

我不知道我是否误解了什么,但我找不到获取名称的方法。

最佳答案

不要在解析器中读取 yytext —— 因为您已经发现它可能无法预测它包含哪个标记,因为解析器可能会提前读取一个标记来决定何时移动或减少。

相反,您应该在词法分析器中(并且仅在词法分析器中)读取 yytext 并复制它,如果您需要在解析器中使用该值。所以你最终得到了一个像这样的词法分析器规则:

[a-zA-Z][a-zA-Z0-9]*    { yylval.str = strdup(yytext); return NAME }

在你的解析器中:

%union {
char *str;
:
}
%token <str> NAME
:
%%
:
table: NAME { setGlobalTableName($1); }
| NAME '.' NAME ...

关于sql - yacc/lex 上的先前标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21555990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com