mjordan
24-03-2004, 15:15
Salve a tutti.
Sto lavorando ad un piccolo compilatore. Man mano che procedo nello sviluppo testo piccole sezioni di codice affinchè tutto proceda per il meglio.
Il mio problema si presenta nel parser.
Ho il seguente linguaggio:
L = { (BIT)^n, n >= 1, BIT e { 0,1 } }
Da questo linguaggio si può esprimere una grammatica context-free non ambigua
(quindi LALR con un solo puntatore di look-ahead senza conflitti shift/reduce).
Ho pertanto generato la seguante grammatica:
s => (a)
a => a BIT
a => BIT
Ho quindi generato il parser mediante sintassi YACC (bison -y), mentre lo scanner l'ho
scritto a mano:
%{
#include <stdio.h>
int counter;
int yylex(void);
extern void yyerror(char * s);
%}
%token BIT
%start s
%%
s : '('a')' {
printf("Valore risultante: %d!\n", counter);
return 0;
}
;
a : a BIT {
if ($2 == 1)
counter++;
}
;
a : BIT {
if ($1 == 1)
counter++;
}
;
%%
int
main(void)
{
counter = 0;
return(yyparse());
}
int
yylex(void)
{
char c;
c = getchar();
if (c == '0' || c == '1') {
c = c - '0';
return BIT;
}
else
return c;
}
Il parser dovrebbe restituire il numero di token BIT pari a 1 ma ottengo sempre e solo 0! Non riesco a fare il debugging perchè non ho ancora implementato una symbol table e dio solo sa come bison gestisca internamente i token senza una tabella di simboli. So solo che in sua assenza ci sono solo decine e decine di goto.
Dove sbaglio? :muro:
Sto lavorando ad un piccolo compilatore. Man mano che procedo nello sviluppo testo piccole sezioni di codice affinchè tutto proceda per il meglio.
Il mio problema si presenta nel parser.
Ho il seguente linguaggio:
L = { (BIT)^n, n >= 1, BIT e { 0,1 } }
Da questo linguaggio si può esprimere una grammatica context-free non ambigua
(quindi LALR con un solo puntatore di look-ahead senza conflitti shift/reduce).
Ho pertanto generato la seguante grammatica:
s => (a)
a => a BIT
a => BIT
Ho quindi generato il parser mediante sintassi YACC (bison -y), mentre lo scanner l'ho
scritto a mano:
%{
#include <stdio.h>
int counter;
int yylex(void);
extern void yyerror(char * s);
%}
%token BIT
%start s
%%
s : '('a')' {
printf("Valore risultante: %d!\n", counter);
return 0;
}
;
a : a BIT {
if ($2 == 1)
counter++;
}
;
a : BIT {
if ($1 == 1)
counter++;
}
;
%%
int
main(void)
{
counter = 0;
return(yyparse());
}
int
yylex(void)
{
char c;
c = getchar();
if (c == '0' || c == '1') {
c = c - '0';
return BIT;
}
else
return c;
}
Il parser dovrebbe restituire il numero di token BIT pari a 1 ma ottengo sempre e solo 0! Non riesco a fare il debugging perchè non ho ancora implementato una symbol table e dio solo sa come bison gestisca internamente i token senza una tabella di simboli. So solo che in sua assenza ci sono solo decine e decine di goto.
Dove sbaglio? :muro: