我写过以下语法:
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;}
;
没有。我认为优先级和关联属性是明确定义的。有人能告诉我如何解决冲突吗?
答案 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_token
和mod_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
(假设div
是div_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
规则的优先顺序排除了如果*
是前瞻字符则首次减少的可能性;同样适用于/
。)
混合这样的中缀和前缀表达式通常不是一个好主意,正是因为这种模糊性。