Как указано ravenspoint, все ожидают, что переменные будут локальными для блока, в котором они определены. try
вводит блок, а также catch
.
Если вы хотите, чтобы переменные были локальными для обоих try
и catch
, попробуйте включить оба блока:
// here is some code
{
string s;
try
{
throw new Exception(":(")
}
catch (Exception e)
{
Debug.WriteLine(s);
}
}
Посмотрите на файл y.output, созданный yacc или bison с аргументом -v. Первый конфликт находится в состоянии 5:
State 5
7 exp: NAME . '(' ')'
8 | NAME . '(' exp ')'
9 | NAME . '(' exp ',' exp ')'
10 | NAME . '=' exp
11 | NAME .
'=' shift, and go to state 14
'(' shift, and go to state 15
'(' [reduce using rule 11 (exp)]
$default reduce using rule 11 (exp)
В этом случае конфликт возникает, когда есть '('
после NAME
- это неоднозначность в вашей грамматике, в которой это может быть вызов выражение, или это может быть простое NAME
выражение, за которым следует выражение в скобках, из-за того, что у вас нет разделителя между операторами на вашем языке.
Второй конфликт:
State 13
4 statment: exp .
17 exp: exp . '+' exp
18 | exp . '-' exp
19 | exp . '*' exp
20 | exp . '/' exp
21 | exp . '%' exp
22 | exp . '^' exp
23 | exp . '&' exp
24 | exp . '|' exp
25 | exp . 'x' exp
'+' shift, and go to state 21
'-' shift, and go to state 22
'*' shift, and go to state 23
'/' shift, and go to state 24
'%' shift, and go to state 25
'&' shift, and go to state 26
'|' shift, and go to state 27
'x' shift, and go to state 28
'^' shift, and go to state 29
'-' [reduce using rule 4 (statment)]
$default reduce using rule 4 (statment)
, что по сути та же проблема, на этот раз с '-'
- вход NAME - NAME
может быть одним двоичным оператором вычитания или два утверждения - ИМЯ, за которым следует одинарный отрицатель.
Если вы добавите разделитель между операторами (например, ;
), оба эти конфликта исчезнут.