bit_expr '+' bit_expr %prec '+'
这里的%prec是什么意思?
我记得我有贴过<LEX&YACC>
查手册吧
忘了提来源了
是mysql 5.1.28rc中sql目录下sql_yacc.y中的语法
bit_expr: bit_expr '|' bit_expr %prec '|' { $$= new (YYTHD->mem_root) Item_func_bit_or($1,$3); if ($$ == NULL) MYSQL_YYABORT; } | bit_expr '&' bit_expr %prec '&' { $$= new (YYTHD->mem_root) Item_func_bit_and($1,$3); if ($$ == NULL) MYSQL_YYABORT; } | bit_expr SHIFT_LEFT bit_expr %prec SHIFT_LEFT { $$= new (YYTHD->mem_root) Item_func_shift_left($1,$3); if ($$ == NULL) MYSQL_YYABORT; } | bit_expr SHIFT_RIGHT bit_expr %prec SHIFT_RIGHT { $$= new (YYTHD->mem_root) Item_func_shift_right($1,$3); if ($$ == NULL) MYSQL_YYABORT; } | bit_expr '+' bit_expr %prec '+' { $$= new (YYTHD->mem_root) Item_func_plus($1,$3); if ($$ == NULL) MYSQL_YYABORT; } | bit_expr '-' bit_expr %prec '-' { $$= new (YYTHD->mem_root) Item_func_minus($1,$3); if ($$ == NULL) MYSQL_YYABORT; } | bit_expr '+' INTERVAL_SYM expr interval %prec '+' { $$= new (YYTHD->mem_root) Item_date_add_interval($1,$4,$5,0); if ($$ == NULL) MYSQL_YYABORT; } | bit_expr '-' INTERVAL_SYM expr interval %prec '-' { $$= new (YYTHD->mem_root) Item_date_add_interval($1,$4,$5,1); if ($$ == NULL) MYSQL_YYABORT; } | bit_expr '*' bit_expr %prec '*' { $$= new (YYTHD->mem_root) Item_func_mul($1,$3); if ($$ == NULL) MYSQL_YYABORT; } | bit_expr '/' bit_expr %prec '/' { $$= new (YYTHD->mem_root) Item_func_div($1,$3); if ($$ == NULL) MYSQL_YYABORT; } | bit_expr '%' bit_expr %prec '%' { $$= new (YYTHD->mem_root) Item_func_mod($1,$3); if ($$ == NULL) MYSQL_YYABORT; } | bit_expr DIV_SYM bit_expr %prec DIV_SYM { $$= new (YYTHD->mem_root) Item_func_int_div($1,$3); if ($$ == NULL) MYSQL_YYABORT; } | bit_expr MOD_SYM bit_expr %prec MOD_SYM { $$= new (YYTHD->mem_root) Item_func_mod($1,$3); if ($$ == NULL) MYSQL_YYABORT; } | bit_expr '^' bit_expr { $$= new (YYTHD->mem_root) Item_func_bit_xor($1,$3); if ($$ == NULL) MYSQL_YYABORT; } | simple_expr ;
定义优先级,为后面的'+'cjaizss 发表于 2011-01-26 00:11
但这个用法似乎有点奇怪 一般定义了一个优先级、结合性,然后%prec
yacc有些忘了,回去有空看一下再解决cjaizss 发表于 2011-01-25 17:00
定义优先级,为后面的'+'
产生式的优先级默认值是最后一个终结符的优先级(所以你给的例子%prec是多余的)但是可以显示改变,从而影响分析器解决冲突的方式比如byacc中的例子有一个规则| '-' expr %prec UMINUS { $$ = - $2; }
前段时间写过一个笔记,可以参考一下
http://blogold.chinaunix.net/u/20830/
这个版问题的类型比较杂,你得首先把你这个问题是关于什么的说清楚. 应该是关于yacc的cjaizss 发表于 2011-01-25 16:55
yacc有些忘了,回去有空看一下再解决
bit_expr '+' bit_expr %prec '+'这里的%prec是什么意思?qtdszws 发表于 2011-01-19 16:59
这里的%prec是什么意思?qtdszws 发表于 2011-01-19 16:59
这个版问题的类型比较杂,你得首先把你这个问题是关于什么的说清楚. 应该是关于yacc的
题目都没看懂
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(9)
我记得我有贴过<LEX&YACC>
查手册吧
忘了提来源了
是mysql 5.1.28rc中sql目录下sql_yacc.y中的语法
bit_expr:
bit_expr '|' bit_expr %prec '|'
{
$$= new (YYTHD->mem_root) Item_func_bit_or($1,$3);
if ($$ == NULL)
MYSQL_YYABORT;
}
| bit_expr '&' bit_expr %prec '&'
{
$$= new (YYTHD->mem_root) Item_func_bit_and($1,$3);
if ($$ == NULL)
MYSQL_YYABORT;
}
| bit_expr SHIFT_LEFT bit_expr %prec SHIFT_LEFT
{
$$= new (YYTHD->mem_root) Item_func_shift_left($1,$3);
if ($$ == NULL)
MYSQL_YYABORT;
}
| bit_expr SHIFT_RIGHT bit_expr %prec SHIFT_RIGHT
{
$$= new (YYTHD->mem_root) Item_func_shift_right($1,$3);
if ($$ == NULL)
MYSQL_YYABORT;
}
| bit_expr '+' bit_expr %prec '+'
{
$$= new (YYTHD->mem_root) Item_func_plus($1,$3);
if ($$ == NULL)
MYSQL_YYABORT;
}
| bit_expr '-' bit_expr %prec '-'
{
$$= new (YYTHD->mem_root) Item_func_minus($1,$3);
if ($$ == NULL)
MYSQL_YYABORT;
}
| bit_expr '+' INTERVAL_SYM expr interval %prec '+'
{
$$= new (YYTHD->mem_root) Item_date_add_interval($1,$4,$5,0);
if ($$ == NULL)
MYSQL_YYABORT;
}
| bit_expr '-' INTERVAL_SYM expr interval %prec '-'
{
$$= new (YYTHD->mem_root) Item_date_add_interval($1,$4,$5,1);
if ($$ == NULL)
MYSQL_YYABORT;
}
| bit_expr '*' bit_expr %prec '*'
{
$$= new (YYTHD->mem_root) Item_func_mul($1,$3);
if ($$ == NULL)
MYSQL_YYABORT;
}
| bit_expr '/' bit_expr %prec '/'
{
$$= new (YYTHD->mem_root) Item_func_div($1,$3);
if ($$ == NULL)
MYSQL_YYABORT;
}
| bit_expr '%' bit_expr %prec '%'
{
$$= new (YYTHD->mem_root) Item_func_mod($1,$3);
if ($$ == NULL)
MYSQL_YYABORT;
}
| bit_expr DIV_SYM bit_expr %prec DIV_SYM
{
$$= new (YYTHD->mem_root) Item_func_int_div($1,$3);
if ($$ == NULL)
MYSQL_YYABORT;
}
| bit_expr MOD_SYM bit_expr %prec MOD_SYM
{
$$= new (YYTHD->mem_root) Item_func_mod($1,$3);
if ($$ == NULL)
MYSQL_YYABORT;
}
| bit_expr '^' bit_expr
{
$$= new (YYTHD->mem_root) Item_func_bit_xor($1,$3);
if ($$ == NULL)
MYSQL_YYABORT;
}
| simple_expr
;
但这个用法似乎有点奇怪
一般定义了一个优先级、结合性,然后%prec
定义优先级,为后面的'+'
产生式的优先级默认值是最后一个终结符的优先级(所以你给的例子%prec是多余的)
但是可以显示改变,从而影响分析器解决冲突的方式
比如byacc中的例子有一个规则
| '-' expr %prec UMINUS
{ $$ = - $2; }
前段时间写过一个笔记,可以参考一下
http://blogold.chinaunix.net/u/20830/
yacc有些忘了,回去有空看一下再解决
这个版问题的类型比较杂,你得首先把你这个问题是关于什么的说清楚.
应该是关于yacc的
题目都没看懂