конфликты: 2 сдвига / уменьшения

Как указано ravenspoint, все ожидают, что переменные будут локальными для блока, в котором они определены. try вводит блок, а также catch.

Если вы хотите, чтобы переменные были локальными для обоих try и catch, попробуйте включить оба блока:

// here is some code
{
    string s;
    try
    {

        throw new Exception(":(")
    }
    catch (Exception e)
    {
        Debug.WriteLine(s);
    }
}
0
задан Marek 18 January 2019 в 18:53
поделиться

1 ответ

Посмотрите на файл 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 может быть одним двоичным оператором вычитания или два утверждения - ИМЯ, за которым следует одинарный отрицатель.

Если вы добавите разделитель между операторами (например, ;), оба эти конфликта исчезнут.

0
ответ дан Chris Dodd 18 January 2019 в 18:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: