qtdszws 发表于 2011-01-19 16:59

这里的%prec是什么意思

bit_expr '+' bit_expr %prec '+'

这里的%prec是什么意思?

amarant 发表于 2011-01-25 15:58

题目都没看懂 :dizzy:

cjaizss 发表于 2011-01-25 16:55

bit_expr '+' bit_expr %prec '+'

这里的%prec是什么意思?
qtdszws 发表于 2011-01-19 16:59 http://linux.chinaunix.net/bbs/images/common/back.gif


    这个版问题的类型比较杂,你得首先把你这个问题是关于什么的说清楚.
   应该是关于yacc的

cjaizss 发表于 2011-01-25 17:00

这个版问题的类型比较杂,你得首先把你这个问题是关于什么的说清楚.
   应该是关于yacc的
cjaizss 发表于 2011-01-25 16:55 http://linux.chinaunix.net/bbs/images/common/back.gif


    yacc有些忘了,回去有空看一下再解决

flw2 发表于 2011-01-25 17:12

产生式的优先级默认值是最后一个终结符的优先级(所以你给的例子%prec是多余的)
但是可以显示改变,从而影响分析器解决冲突的方式
比如byacc中的例子有一个规则
| '-' expr %prec UMINUS
            { $$ = - $2; }

前段时间写过一个笔记,可以参考一下

http://blogold.chinaunix.net/u/20830/

cjaizss 发表于 2011-01-26 00:11

yacc有些忘了,回去有空看一下再解决
cjaizss 发表于 2011-01-25 17:00 http://linux.chinaunix.net/bbs/images/common/back.gif


    定义优先级,为后面的'+'

cjaizss 发表于 2011-01-26 00:13

定义优先级,为后面的'+'
cjaizss 发表于 2011-01-26 00:11 http://linux.chinaunix.net/bbs/images/common/back.gif


    但这个用法似乎有点奇怪
一般定义了一个优先级、结合性,然后%prec

qtdszws 发表于 2011-01-26 09:47

忘了提来源了

是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
      ;

EricFisher 发表于 2011-01-26 11:37

查手册吧

cjaizss 发表于 2011-01-28 08:36

我记得我有贴过<LEX&YACC>
页: [1] 2
查看完整版本: 这里的%prec是什么意思