野牛减少/减少冲突

时间:2017-07-10 11:43:01

标签: bison reduce-reduce-conflict

我写过以下语法:

listViewHolder.switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                new AlertDialog.Builder(mContext, R.style.AppCompatAlertDialogStyle).setTitle("Warning").setMessage("You want to whiteList this application?").setPositiveButton("YES", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        ArrayList<WhiteListModel> res = null;
                        for (int position = 0; position < listStorage.size(); position++) {
                            //here i am adding items to another arraylist
                            res = new ArrayList<WhiteListModel>();
                            WhiteListModel whiteListModel = new WhiteListModel();
                            whiteListModel.setName(listStorage.get(position).getName());
                            whiteListModel.setPackName(listStorage.get(position).getPackName());
                            res.add(whiteListModel);

                        }
                        saveScoreListToSharedpreference(res);


                        listStorage.remove(position);
                        notifyDataSetChanged();
                        listViewHolder.switchCompat.setChecked(false);

                    }
                }).setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        listViewHolder.switchCompat.setChecked(false);
                    }
                }).show();

            }

        }
    });

现在,野牛发现8次减少/减少冲突。当我删除行

%union{
    string *s;
    float num;
}
%token div_token mod_token sqrt_token it_token abs_token
%token <num> num_token 
%token <s> Stampa
%type <num> E


%left '+' '-'
%left '*' '/' div_token mod_token
%left UMINUS
%left abs_token sqrt_token


%%

Program: Program Line '\n'   { }
| Line  '\n' { }
;

Line: Stampa    {cout<<*$1<<endl;}
| E         {cout<<$1<<endl; broj = $1;}
| it_token      {cout<<broj<<endl;}
;

E: E '+' E {$$ = $1 + $3;}
| E '-' E {$$ = $1 - $3;}
| E '*' E {$$ = $1 * $3;}
| E '/' E {if($3!=0) 
              $$ = $1 / $3;
            else
              yyerror("Deljenje nulom");
            }
| mod_token E E {$$ = (float)((int)$2 % (int)$3);}
| div_token E E {$$ = (float)((int)($2 / $3));}
| sqrt_token E  { $$ = sqrt($2); }
| '(' E ')' {$$=$2;}
| abs_token E { $$ = abs($2);}
| '-' E %prec UMINUS {$$=-$2;}
| num_token {$$ = $1;}
;

没有。我认为优先级和关联属性是明确定义的。有人能告诉我如何解决冲突吗?

2 个答案:

答案 0 :(得分:1)

  

现在,野牛发现8次减少/减少冲突。当我删除行

| '-' E %prec UMINUS {$$=-$2;}
  

没有。我认为优先级和关联属性是明确定义的。有人能告诉我如何解决冲突吗?

这应解决问题:

%union{
      string *s;
      float num;
}
%token div_token mod_token sqrt_token it_token abs_token
%token <num> num_token 
%token <s> Stampa
%type <num> E

%left '+' '-'
%left '*' '/' div_token mod_token
%left UMINUS
%left abs_token sqrt_token

%%

Program: Program Line '\n'   { }
| Line  '\n' { }
;

Line: Stampa    {cout<<*$1<<endl;}
| E         {cout<<$1<<endl; broj = $1;}
| it_token      {cout<<broj<<endl;}
;

E: E '+' E {$$ = $1 + $3;}
| E '-' E {$$ = $1 - $3;}
| E '*' E {$$ = $1 * $3;}
| E '/' E {if($3!=0) 
                $$ = $1 / $3;
                    else
                yyerror("Deljenje nulom");
          }
| E mod_token E {$$ = (float)((int)$1 % (int)$3);}
| E div_token E {$$ = (float)((int)($1 / $3));}
| sqrt_token E  { $$ = sqrt($2); }
| '(' E ')' {$$=$2;}
| abs_token E { $$ = abs($2);}
| '-' %prec UMINUS E {$$=-$2;}
| num_token {$$ = $1;}
;

这解决了一些问题。你可能意味着:

| E mod_token E {$$ = (float)((int)$1 % (int)$3);}
| E div_token E {$$ = (float)((int)($1 / $3));}

更清楚的是写下以下内容:

| '-' %prec UMINUS E {$$=-$2;}

您可以看到与生成-v的野牛选项xyz.output的冲突:

state 35

    6 E: E . '+' E
    7  | E . '-' E
    7  | E '-' E .
    8  | E . '*' E
    9  | E . '/' E
   15  | '-' E 

.

    div_token   reduce using rule 7 (E)
    div_token   [reduce using rule 15 (E)]
    mod_token   reduce using rule 7 (E)
    mod_token   [reduce using rule 15 (E)]
    sqrt_token  reduce using rule 7 (E)
    sqrt_token  [reduce using rule 15 (E)]
    abs_token   reduce using rule 7 (E)
    abs_token   [reduce using rule 15 (E)]
    num_token   reduce using rule 7 (E)
    num_token   [reduce using rule 15 (E)]
    '+'         reduce using rule 7 (E)
    '+'         [reduce using rule 15 (E)]
    '-'         reduce using rule 7 (E)
    '-'         [reduce using rule 15 (E)]
    '*'         reduce using rule 15 (E)
    '/'         reduce using rule 15 (E)
    '\n'        reduce using rule 15 (E)
    '('         reduce using rule 7 (E)
    '('         [reduce using rule 15 (E)]
    ')'         reduce using rule 15 (E)
    $default    reduce using rule 7 (E)

div_tokenmod_token的运算符减少是可疑的。语法的模糊性是由应用于两个表达式E的这些运算符引起的。

修改

也许你正在寻找保留前缀div和mod运算符。如果是这样,您需要消除语法歧义。一种可能的解决方案是:

| mod_token F F {$$ = (float)((int)$2 % (int)$3);}
| div_token F F {$$ = (float)((int)($2 / $3));}
| F
;
F: '(' E ')' {$$=$2;}
| sqrt_token E  { $$ = sqrt($2); }
| abs_token E { $$ = abs($2);}
| '-' %prec UMINUS E {$$=-$2;}
| num_token {$$ = $1;}
;

并添加F的类型:

%type <num> E F

答案 1 :(得分:1)

优先关系仅用于解决转移/减少冲突。它们不能用于解决减少/减少冲突,因为优先级比较总是在生产(可以减少)和令牌(可以转移)之间。< / p>

考虑到这一点,请考虑解析表达式的过程:

div 7 - 3 - 2

(假设divdiv_token的编写方式。

每个 - 可以是中缀减法运算符或前缀否定运算符。在这种情况下,由于div必须紧跟两个表达式,因此正好一个减号必须是中缀。但是哪个?是吗

div (7-3) (-2)

div (7) (-3-2)

但当然,其他情况也是可能的。如果表达式为div 7 - 3 - 2 a,则唯一有效的解析为div ((7-3)-2) 8,而如果表达式为div div 7 - 3 - 2,则解析必须为div (div 7 (-3)) (-2)

通过让bison使用-v选项创建解析报告并查看生成的.output文件,您可以更深入地了解冲突。根据您的语法,该报告显示减少/减少冲突位于状态35,即:

State 35

    6 E: E . '+' E
    7  | E . '-' E
    7  | E '-' E .
    8  | E . '*' E
    9  | E . '/' E
   15  | '-' E .

    div_token   reduce using rule 7 (E)
    div_token   [reduce using rule 15 (E)]

(actions truncated for space)

可能的缩减对应于末尾有.的LR项,即E '-' E .'-' E .。对于大多数(但不是全部)前瞻标记,这些减少都是可能的。 (*优先于E: E '-' E规则的优先顺序排除了如果*是前瞻字符则首次减少的可能性;同样适用于/。)

混合这样的中缀和前缀表达式通常不是一个好主意,正是因为这种模糊性。