Compiler construction 使用SableCC转移/减少冲突

Compiler construction 使用SableCC转移/减少冲突,compiler-construction,sablecc,Compiler Construction,Sablecc,我正在努力解决这个冲突,我已经尝试消除exp上的递归,但是由于移位不使用Pontoevig令牌,移位/减少冲突仍然存在 此外,任何减少/减少冲突的建议都将受到赞赏,因为我也在努力解决这些问题 语法部分: shift/reduce conflict in state [stack: PFamilia TClasse TCid TBlocoIni TCons PTipoPrimitivo TId TAtribuicaoConst TId *] on TPontoEVirg in { [ PF

我正在努力解决这个冲突,我已经尝试消除exp上的递归,但是由于移位不使用Pontoevig令牌,移位/减少冲突仍然存在

此外,任何减少/减少冲突的建议都将受到赞赏,因为我也在努力解决这些问题

语法部分:

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)
}

我想我不明白为什么不允许在算术表达式中调用函数,当然我也不明白为什么要在
logic\u cham\u atr
中使用分号。没有其他因素包含分号,分号似乎在语法中通常用作分隔符。这不是减少冲突的唯一转变,对吗?看来你的求幂规则应该会导致大量的冲突。logic_cham_atr是解决这个问题的一个尝试,但我可以看出它是多余的。在此之前,我试着把这些句子放在factor_逻辑中,作为“exp”的替代,所有这些都失败了,这可能太激进了。很抱歉我很想帮你,但我真的不知道你想解析什么语言。我所能看到的只是你语法的一部分,即使在那里,它也被以某种方式修改了,但没有起作用,也没有保留原来的语法描述。除此之外,您的语法摘录不包括令牌定义,因此您必须猜测名称是指令牌还是未包含其定义的非终端。请提供一份报告;这将使我们所有人的生活更轻松。
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;