- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一些 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/
我的应用将 SceneKit 内容的“页面”与图像和文本交替。当我从图像页面前进到新的 SceneKit 页面时,前一个 SceneKit 页面中的内容会短暂显示,然后被新内容替换。时髦。 我只使用一
我正在尝试处理(在 C# 中)包含一些数字数据的大型数据文件。给定一个整数数组,如何对其进行拆分/分组,以便如果下一个 n(两个或更多)是负数,则前一个 n 元素被分组。例如,在下面的数组中,应该使用
刚接触promises,研究过。所以我的代码和我的理解: sql.connect(config).then(function(connection) { return connection.req
目前我在 if (roobaf) block 中有一些代码,这取决于 foo 和 bar 是否为假。我可以在 block 内再次检查这些条件,但感觉像是不必要的代码重复。 if (foo) {
我是一名优秀的程序员,十分优秀!