【发布时间】:2015-08-10 16:28:22
【问题描述】:
我正在尝试使用 Bison 和 Flex 制作一个小型编译器,但我经常出现移位/减少错误。我怀疑问题出在规则“assignacion”和规则“booleano”、“comparacion”、“expresionArit”、“termino”、“potencia”上。 可能语法定义不正确。 我希望通过使用“%prec”来解决这个问题,但我没有成功。
然后我把代码Bison和错误:
...
%start programa
%token <id> IDENTIFICADOR
%token <intvalue> ENTERO
%token <floatvalue> FLOTANTE
%token <boolvalue> BOOLEANO
%token <stringvalue> CADENA
%token <etiqueta> IF ELSEIF ELSE FOR WHILE DO IN READ WRITE PRINT BREAK CONTINUE PASS EXCEPT TO DOWNTO
%token NL EOF_INS APAR OPAR ACLAU OCLAU
%left OR
%left AND
%nonassoc PEQUENO GRANDE PEQIG GRAIG IGUAL DIFFE
%left MENOS MAS
%left DIVISION_ENTERA DIVISION PRODUCTO MODULO
%right EXPONENTE
%right ASSIGNACIONS
%nonassoc IFX
%nonassoc ELSE
%%
programa : bloques;
bloques : bloque bloques
| bloque
;
bloque : if_sentencia
| while_sentencia
| for_sentencia
| do_sentencia
| instruccion
| NL
;
if_sentencia : IF expresion ACLAU bloques OCLAU %prec IFX
| IF expresion ACLAU bloques OCLAU else_sentencia
;
else_sentencia : ELSE expresion ACLAU bloques OCLAU
| ELSEIF expresion ACLAU bloques OCLAU else_sentencia
;
while_sentencia: WHILE expresion ACLAU bloques OCLAU
;
for_sentencia: FOR APAR assignacion EOF_INS expresion EOF_INS assignacion OPAR ACLAU bloques OCLAU
;
do_sentencia: DO ACLAU bloques OCLAU WHILE expresion EOF_INS
;
instruccion : expresion EOF_INS;
expresion: expresion OR expresion
| booleano;
booleano: booleano AND booleano
| comparacion;
comparacion: comparacion PEQUENO comparacion
| comparacion GRANDE comparacion
| comparacion PEQIG comparacion
| comparacion GRAIG comparacion
| comparacion IGUAL comparacion
| comparacion DIFFE comparacion
| expresionArit
;
expresionArit: expresionArit MAS expresionArit
| expresionArit MENOS expresionArit
| termino;
termino: termino PRODUCTO termino
| termino DIVISION termino
| termino DIVISION_ENTERA termino
| termino MODULO termino
| potencia
;
potencia: potencia EXPONENTE potencia
| factor
;
factor: ENTERO {printd("INT\n");}
| FLOTANTE {printd("FLOAT\n");}
| BOOLEANO {printd("BOOL\n");}
| CADENA {printd("STRING\n");}
| APAR expresion OPAR
| assignacion
;
assignacion: variable ASSIGNACIONS expresion {printd("ASSIGNACION");} | variable;
// a=b=c;
variable: IDENTIFICADOR {printd("VARIABLE\n");};
%%
int
yyerror (char const *s)
{
printf ("%s\n", s);
}
void main(int argc, char *argv[])
{
extern FILE *yyin;
++argv; --argc;
yyin = fopen( argv[0], "r" );
yyparse();
}
错误:
conflictos: 14 desplazamiento(s)/reducción(ones)
我查看了输出,有些产品会产生错误,但要解决它们。
estado 21
19 expresion: booleano .
20 booleano: booleano . AND booleano
AND desplazar e ir al estado 38
AND [reduce usando la regla 19 (expresion)]
$default reduce usando la regla 19 (expresion)
estado 22
21 booleano: comparacion .
22 comparacion: comparacion . PEQUENO comparacion
23 | comparacion . GRANDE comparacion
24 | comparacion . PEQIG comparacion
25 | comparacion . GRAIG comparacion
26 | comparacion . IGUAL comparacion
27 | comparacion . DIFFE comparacion
DIFFE desplazar e ir al estado 39
IGUAL desplazar e ir al estado 40
GRAIG desplazar e ir al estado 41
PEQIG desplazar e ir al estado 42
GRANDE desplazar e ir al estado 43
PEQUENO desplazar e ir al estado 44
DIFFE [reduce usando la regla 21 (booleano)]
IGUAL [reduce usando la regla 21 (booleano)]
GRAIG [reduce usando la regla 21 (booleano)]
PEQIG [reduce usando la regla 21 (booleano)]
GRANDE [reduce usando la regla 21 (booleano)]
PEQUENO [reduce usando la regla 21 (booleano)]
$default reduce usando la regla 21 (booleano)
estado 23
28 comparacion: expresionArit .
29 expresionArit: expresionArit . MAS expresionArit
30 | expresionArit . MENOS expresionArit
MAS desplazar e ir al estado 45
MENOS desplazar e ir al estado 46
MAS [reduce usando la regla 28 (comparacion)]
MENOS [reduce usando la regla 28 (comparacion)]
$default reduce usando la regla 28 (comparacion)
estado 24
31 expresionArit: termino .
32 termino: termino . PRODUCTO termino
33 | termino . DIVISION termino
34 | termino . DIVISION_ENTERA termino
35 | termino . MODULO termino
MODULO desplazar e ir al estado 47
PRODUCTO desplazar e ir al estado 48
DIVISION desplazar e ir al estado 49
DIVISION_ENTERA desplazar e ir al estado 50
MODULO [reduce usando la regla 31 (expresionArit)]
PRODUCTO [reduce usando la regla 31 (expresionArit)]
DIVISION [reduce usando la regla 31 (expresionArit)]
DIVISION_ENTERA [reduce usando la regla 31 (expresionArit)]
$default reduce usando la regla 31 (expresionArit)
estado 25
36 termino: potencia .
37 potencia: potencia . EXPONENTE potencia
EXPONENTE desplazar e ir al estado 51
EXPONENTE [reduce usando la regla 36 (termino)]
$default reduce usando la regla 36 (termino)
【问题讨论】:
标签: c compiler-construction bison lex