Я пытаюсь создать синтаксический анализатор для языка верстки, и на данный момент он в значительной степени готов (у меня есть несколько тестовых файлов, и он отлично их анализирует). Проблема в том, что у меня 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% точен)
Я предполагаю, что это как-то связано с рекурсивным правилом , но я не знаю, как это исправить, так как мне нужно правило "инструкция", чтобы иметь возможность анализировать более одной инструкции. Так что, если кто знает, как разрешать конфликты, было бы здорово.
Заранее спасибо!