Сдвиг / уменьшение конфликта с помощью SableCC - PullRequest
0 голосов
/ 02 марта 2020
shift/reduce conflict in state [stack: PFamilia TClasse TCid TBlocoIni TCons PTipoPrimitivo TId TAtribuicaoConst TId *] on TPontoEVirg in {
    [ PFatorArt = TId * ] followed by TPontoEVirg (reduce),
    [ PLogicChamAtr = TId * TPontoEVirg ] (shift)
}

Я изо всех сил пытаюсь разрешить этот конфликт, я пытался устранить рекурсию на exp, но поскольку сдвиг не использует токен PontoEVirg, конфликт сдвига / уменьшения сохраняется.

Также любой советы по уменьшению / уменьшению конфликтов приветствуются, так как я тоже боролся с ними

Часть грамматики:

programa = {programa} familia def_classe;
 relacao = {relacao} classe [left]:cid filha_classe [right]:cid;
 familia = {familia} relacao relacoes* ponto_e_virg;
 relacoes = {relacao_lista} e_comercial relacao;

 def_classe = {def_classe} classe cid bloco_ini atributos metodos bloco_fim;

 atributos_opcoes = {atributos_opcoes} atributos_opcoesb | dec_cons;
 atributos_opcoesb = {atributos_opcoesb} dec_obj | dec_var;
 atributos = {atributos_fecho} atributos_opcoes*;
 metodos_opcoes = {metodos_opcoes} dec_procedimento | dec_funcao;
 metodos = {metodos_fecho} metodos_opcoes*;
 virg_id = {virg_id} virg id;
 dec_obj = {dec_obj} objeto cid id virg_id* ponto_e_virg;
 dec_var = {dec_var} var tipo id virg_id* ponto_e_virg;
 virg_ini = {virg_ini} virg inicializacao;
 dec_cons = {dec_cons} cons tipo_primitivo inicializacao virg_ini* ponto_e_virg;
 inicializacao = {inicializacao} id atribuicao_const exp; 

 tipo = {tipo} tipo_classe | tipo_primitivo;
 tipo_primitivo = {tipo_primitivo} tipo_primitivob | real;
 tipo_primitivob = {tipo_primitivob} inteiro | booleano;
 tipo_classe = {tipo_classe} cid;

bloco = bloco_ini atributos comando* bloco_fim;


 exp_logic = {explogic_e} exp_logic e_comparacao termo_logic
 | {explogic_ou} exp_logic ou_comparacao termo_logic
 | {explogic_termo} termo_logic;

 termo_logic = {termologic_par} par_esq exp par_dir
 | {termologic_neg} negacao termo_logic
 | {termologic_fator} fator_logic;

 fator_logic = {fatorlogic_igual} exp_art igual termo_art
 | {fatorlogic_maiorq} exp_art maior_que termo_art
 | {fatorlogic_menorq} exp_art menor_que termo_art
 | {fatorlogic_se} se par_esq [left]:exp par_dir entao [middle]:exp senao [right]:exp
 | {fatorlogic_chamatr} logic_cham_atr
 | {fatorlogic_bool} booleano;

 logic_cham_atr = {cham_atr} id_ponto? cham_atr ponto_e_virg;
 cham_atr = {exp_chamatr} chamada | atributo; 

 exp_art = {expart_soma} exp_art soma termo_art
 | {expart_subtracao} exp_art subt termo_art
 | {expart_termo} termo_art;

 termo_art = {termoart_mult} termo_art mult fator_art 
 | {termoart_div} termo_art div fator_art 
 | {termoart_mod} termo_art mod fator_art
 | {termoart_fator} fator_art;

 fator_art = {fatorart_id} id 
 | {fatorart_menos} subt fator_art
 | {fatorart_pot} [left]:fator_art potencia [right]:fator_art
 | {fatorart_int} inteiro
 | {fatorart_real} real
 | {fatorart_bloco} bloco_exp;

 bloco_exp = {bloco_exp} bloco_ini dec_cons* exp bloco_fim;
 chamada = {chamada} id par_esq lista_exp par_dir;
 atributo = {atributo} id;
 lista_exp = {lista_exp} exp? virg_exp*;
 exp_booleano = {exp_boolean} true | false;
 exp_real = {exp_real} [left]:numero ponto [right]:numero;
 exp_inteiro = {exp_inteiro} numero;
 exp = {expart} exp_art | {explogic} exp_logic;
 virg_exp = {virg_exp} virg exp;
...