Jump to content
dagas46

Byacc shift/reduce, reduce/reduce

Recommended Posts

dagas46

Boa tarde,

estou actualmente a fazer um projecto para a universidade e estou com uns problemas que gostava que me ajudassem.

Tenho este ficheiro .y e tenho duas regras para acrescentar mas ao acrescenta-las fico com conflitos shift/reduce e reduce/reduce. Será que me podiam ajudar a resolver esses conflitos?

As regras que tenho que adicionar à gramática são:

instrucao : left_value '{' ',' left_value '}' '>-' expresso '{' ',' expressao '}' ';'

| left_value '{' ',' left_value '}' '?'

O símbolo '>-' corresponde ao token GM

%{
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include "tabid.h"

void yyerror(char* s);
%}

%union{
int i;
double d;
char* s;
}

%token <i> INT
%token <d> FLOAT
%token <s> STRING ID
%token EQ GE LE NE LM GM INC DEC PE DEF REAL INTEGER EXPORT IMPORT IF FOR ELSE RETURN BREAK CONTINUE

%nonassoc IFX FORX
%nonassoc ELSE
%right '='
%left '|'
%left '&'
%nonassoc '!'
%left EQ NE
%left '<' '>' LE GE
%left '+' '-'
%left '*' '/' '%'
%right '^'
%nonassoc PTR ADD UMINUS INC DEC
%nonassoc '(' ')'
%start ficheiro

%%

ficheiro : decl
;

decl : decl declaracao
| /* vazio */
;

declaracao : IMPORT tipo ID init
| EXPORT tipo ID init
| IMPORT tipo ID
| EXPORT tipo ID
| tipo ID init
| tipo ID
;

tipo : INTEGER
| REAL
| tipo '*'
;

init : '=' INT ';'
| '=' FLOAT
| '=' ID
| '(' parametros ')' '=' INT corpo
| '(' parametros ')' '=' FLOAT corpo
| '(' parametros ')' '=' ID corpo
| '(' parametros ')' ';'
| '(' ')' '=' INT corpo
| '(' ')' '=' FLOAT corpo
| '(' ')' '=' ID corpo
| '(' ')' ';'
;

parametros : parametro param
;

param : param ',' parametro
| /* vazio */
;

parametro : tipo ID '=' INT
| tipo ID '=' FLOAT
| tipo ID '=' ID
| tipo ID
;

corpo : '{' parametros ';' instr '}'
| '{' instr '}'
;

instr : instr instrucao
| /* vazio */
;

instrucao : IF expressao ':' instrucao ELSE instrucao
| IF expressao ':' instrucao %prec IFX
| FOR expressao ';' expressao ';' expressao ':' instrucao ELSE instrucao
| FOR expressao ';' expressao ';' expressao ':' instrucao %prec FORX
| FOR expressao ';' expressao ';' ':' instrucao ELSE instrucao
| FOR expressao ';' expressao ';' ':' instrucao %prec FORX
| FOR expressao ';' ';' expressao ':' instrucao ELSE instrucao
| FOR expressao ';' ';' expressao ':' instrucao %prec FORX
| FOR ';' expressao ';' expressao ':' instrucao ELSE instrucao
| FOR ';' expressao ';' expressao ':' instrucao %prec FORX
| FOR expressao ';' ';' ':' instrucao ELSE instrucao
| FOR expressao ';' ';' ':' instrucao %prec FORX
| FOR ';' expressao ';' ':' instrucao ELSE instrucao
| FOR ';' expressao ';' ':' instrucao %prec FORX
| FOR ';' ';' expressao ':' instrucao ELSE instrucao
| FOR ';' ';' expressao ':' instrucao %prec FORX
| FOR ';' ';' ':' instrucao ELSE instrucao
| FOR ';' ';' ':' instrucao %prec FORX
| expressao PE
| expressao '!'
| expressao ';'
| ';'
| corpo
| RETURN expressao ';'
| RETURN ';'
| BREAK INT ';'
| BREAK ';'
| CONTINUE INT ';'
| CONTINUE ';'
| left_value '#' expressao ';'
;

left_value : ID
| '*' left_value %prec PTR
| '&' left_value %prec ADD
;


expr : expr ',' expressao
| expressao
| /* vazio */
;

expressao : left_value
| INT
| FLOAT
| STRING
| '(' expressao ')'
| ID '(' expr ')'
| '-' expressao %prec UMINUS
| left_value INC
| left_value DEC
| INC left_value
| DEC left_value
| expressao '^' expressao
| expressao '*' expressao
| expressao '/' expressao
| expressao '%' expressao
| expressao '+' expressao
| expressao '-' expressao
| expressao '<' expressao
| expressao '>' expressao
| expressao LE expressao
| expressao GE expressao
| expressao EQ expressao
| expressao NE expressao
| '!' expressao
| expressao '&' expressao
| expressao '|' expressao
| left_value '=' expressao
;
%%

Obrigado

Edited by dagas46

Share this post


Link to post
Share on other sites
KTachyon

Se o '>-' já vem traduzido como GM do lex, não vejo como possa ser interpretado de outra forma pelo yacc. Desde que coloques GM em vez de '>-' (coisa que vou assumir que estás a fazer).

Não tendo em conta a estrutura de algumas partes da tua árvore que podiam ser facilmente simplificadas, não estou a ver problemas com esse código (incluindo com as linhas que queres adicionar). O yacc gera o ficheiro C sem problemas. Podes colocar o ficheiro exactamente como o tens para estar a dar erro?


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.