这里的%prec是什么意思
bit_expr '+' bit_expr %prec '+'这里的%prec是什么意思? 题目都没看懂 :dizzy: bit_expr '+' bit_expr %prec '+'
这里的%prec是什么意思?
qtdszws 发表于 2011-01-19 16:59 http://linux.chinaunix.net/bbs/images/common/back.gif
这个版问题的类型比较杂,你得首先把你这个问题是关于什么的说清楚.
应该是关于yacc的 这个版问题的类型比较杂,你得首先把你这个问题是关于什么的说清楚.
应该是关于yacc的
cjaizss 发表于 2011-01-25 16:55 http://linux.chinaunix.net/bbs/images/common/back.gif
yacc有些忘了,回去有空看一下再解决 产生式的优先级默认值是最后一个终结符的优先级(所以你给的例子%prec是多余的)
但是可以显示改变,从而影响分析器解决冲突的方式
比如byacc中的例子有一个规则
| '-' expr %prec UMINUS
{ $$ = - $2; }
前段时间写过一个笔记,可以参考一下
http://blogold.chinaunix.net/u/20830/ yacc有些忘了,回去有空看一下再解决
cjaizss 发表于 2011-01-25 17:00 http://linux.chinaunix.net/bbs/images/common/back.gif
定义优先级,为后面的'+' 定义优先级,为后面的'+'
cjaizss 发表于 2011-01-26 00:11 http://linux.chinaunix.net/bbs/images/common/back.gif
但这个用法似乎有点奇怪
一般定义了一个优先级、结合性,然后%prec 忘了提来源了
是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
; 查手册吧 我记得我有贴过<LEX&YACC>
页:
[1]
2