Бизон: смещение / уменьшение конфликтов - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь создать синтаксический анализатор для языка верстки, и на данный момент он в значительной степени готов (у меня есть несколько тестовых файлов, и он отлично их анализирует). Проблема в том, что у меня 13 конфликтов сдвига / уменьшения, и я не знаю, как их решить.

Я заглянул в файл .output и обнаружил, что все конфликты находятся в одном и том же состоянии:

Estado 169 conflictos: 13 desplazamiento(s)/reducción(ones)

(конфликты состояний 169: 13 сдвиг / уменьшение)

Это часть грамматики в состоянии 169: (я не думаю, что имена важны, поэтому я не буду переводить , если кто-то думает, что какая-либо другая часть грамматики имеет отношение к делу, скажите мне, но она действительно длинная).

instruccion: instruccion instruccion                    { printf("\tREGLA: instruccion -> instruccion instruccion\n"); }
           | instruccion_asignacion                     { printf("\tREGLA: instruccion -> instruccion_asignacion\n"); }
           | instruccion_devolver                       { printf("\tREGLA: instruccion -> instruccion_devolver\n"); }
           | instruccion_llamada                        { printf("\tREGLA: instruccion -> instruccion_llamada\n"); }
           | instruccion_si                             { printf("\tREGLA: instruccion -> instruccion_si\n"); }
           | instruccion_casos                          { printf("\tREGLA: instruccion -> instruccion_casos\n"); }
           | instruccion_bucle                          { printf("\tREGLA: instruccion -> instruccion_bucle\n"); }
           | instruccion_interrupcion                   { printf("\tREGLA: instruccion -> instruccion_interrupcion\n"); }
           | instruccion_lanzamiento_excepcion          { printf("\tREGLA: instruccion -> instruccion_lanzamiento_excepcion\n"); }
           | instruccion_captura_excepcion              { printf("\tREGLA: instruccion -> instruccion_captura_excepcion\n"); }
           | ';'                                        { printf("\tREGLA: instruccion -> ;\n"); }
           | error  ';'                                 {yyerrok;}
;

А вот выходная информация для состояния 169 (я сделал быстрый перевод ниже, чтобы не перевести весь блок):

estado 169

  114 instruccion: instruccion . instruccion
  114            | instruccion instruccion .

    error          desplazar e ir al estado 74
    CASOS          desplazar e ir al estado 75
    DEVOLVER       desplazar e ir al estado 76
    LANZA          desplazar e ir al estado 77
    MIENTRAS       desplazar e ir al estado 78
    PARA           desplazar e ir al estado 79
    PRUEBA         desplazar e ir al estado 80
    REPETIR        desplazar e ir al estado 81
    SALIR          desplazar e ir al estado 82
    SI             desplazar e ir al estado 83
    SIGUIENTE      desplazar e ir al estado 84
    IDENTIFICADOR  desplazar e ir al estado 85
    ';'            desplazar e ir al estado 86

    error          [reduce usando la regla 114 (instruccion)]
    CASOS          [reduce usando la regla 114 (instruccion)]
    CUANDO         reduce usando la regla 114 (instruccion)
    DEVOLVER       [reduce usando la regla 114 (instruccion)]
    EXCEPCION      reduce usando la regla 114 (instruccion)
    FIN            reduce usando la regla 114 (instruccion)
    FINALMENTE     reduce usando la regla 114 (instruccion)
    LANZA          [reduce usando la regla 114 (instruccion)]
    MIENTRAS       [reduce usando la regla 114 (instruccion)]
    PARA           [reduce usando la regla 114 (instruccion)]
    PRUEBA         [reduce usando la regla 114 (instruccion)]
    REPETIR        [reduce usando la regla 114 (instruccion)]
    SALIR          [reduce usando la regla 114 (instruccion)]
    SI             [reduce usando la regla 114 (instruccion)]
    SIGUIENTE      [reduce usando la regla 114 (instruccion)]
    SINO           reduce usando la regla 114 (instruccion)
    IDENTIFICADOR  [reduce usando la regla 114 (instruccion)]
    ';'            [reduce usando la regla 114 (instruccion)]

    nombre                             ir al estado 87
    instruccion                        ir al estado 169
    instruccion_asignacion             ir al estado 89
    instruccion_devolver               ir al estado 90
    instruccion_llamada                ir al estado 91
    llamada_subprograma                ir al estado 92
    instruccion_si                     ir al estado 93
    instruccion_casos                  ir al estado 94
    instruccion_bucle                  ir al estado 95
    clausula_iteracion                 ir al estado 96
    instruccion_interrupcion           ir al estado 97
    instruccion_lanzamiento_excepcion  ir al estado 98
    instruccion_captura_excepcion      ir al estado 99
    objeto                             ir al estado 100
"desplazar e ir al estado X" :: "shift and go to state X"
"reduce usando la regla 114 (instruccion)" :: "reduce using rule 144 (instruccion)"
"ir al estado X" :: "go to state X"

(извините, если перевод не на 100% точен)

Я предполагаю, что это как-то связано с рекурсивным правилом , но я не знаю, как это исправить, так как мне нужно правило "инструкция", чтобы иметь возможность анализировать более одной инструкции. Так что, если кто знает, как разрешать конфликты, было бы здорово.

Заранее спасибо!

...