0

Je pense que mon programme devrait être en mesure de reconnaître ce qui suit comme une déclaration de fonction:programme Yacc ne reconnaît pas la déclaration de fonction

int fn(int i) { int n; return; } 

mais il ne fonctionne pas.

Voici la partie pertinente de mon dossier yacc:

program : declaration_list ; 

declaration_list : declaration_list declaration | declaration ; 

declaration : var_declaration 
      | fun_declaration 
      | '$' { printTable();}; 

var_declaration : type_specifier ID ';' {$2->value = 0; $2->arraysize = 0;}; 
       | type_specifier ID '[' NUM ']' ';' {$2->arraysize = $4;printf("Array size is %d", $2->arraysize);} ; 

type_specifier : INT | VOID ; 

fun_declaration : type_specifier ID '(' params ')' compound_stmt {printf("function declaration\n"); printf("Parameters: \n", $2->args); } ; 


params : param_list | VOID ; 

param_list : param_list ',' param 
      | param ; 

param : type_specifier ID | type_specifier ID '[' ']' ; 

compound_stmt : '{' local_declarations statement_list '}' {printf("exiting scope\n"); } ; 

local_declarations : local_declarations var_declaration 
        | /* empty */ ; 

statement_list : statement_list statement 
       | /* empty */ ; 

statement : expression_stmt 
      | compound_stmt 
      | selection_stmt 
      | iteration_stmt 
      | return_stmt ; 

expression_stmt : expression ';' 
       | ';' ; 

selection_stmt : IF '(' expression ')' statement 
       | IF '(' expression ')' statement ELSE statement ; 

iteration_stmt : WHILE '(' expression ')' statement ; 

return_stmt : RETURN ';' | RETURN expression ';' ; 

Pourquoi reconnaît-elle pas?

+0

Quelle est la sortie? Où produit-elle l'erreur? –

+0

Si je tape int main (void) {int, il dira "yyerror: erreur de syntaxe" après avoir tapé int. – neuromancer

Répondre

-1

a juste regardé la ligne où vous avez

 
local_declarations : local_declarations var_declaration 
        | /* empty */ ; 

Cette ligne semble gênant pour moi, puisque vous avez comme une déclaration récursive ...

espère que cela vous donne l'indice, Cordialement, Tom.

0

Je pense que vous avez besoin quelque chose comme:

declaration : type_specifier ID ';' {$2->value = 0; $2->arraysize = 0;}; 
      | type_specifier ID '[' NUM ']' ';' {$2->arraysize = $4;printf("Array size is %d", $2->arraysize);} ; 
      | type_specifier ID '(' params ')' compound_stmt {printf("function declaration\n"); printf("Parameters: \n", $2->args); } ; 

      | '$' { printTable();}; 

type_specifier: INT | VOID;

1

Ceci n'est pas une réponse à votre question mais une suggestion pour le débogage. Après chacune des règles, ajoutez une instruction printf qui vous indique que la règle a été mise en correspondance. Jetez un oeil à my answer here pour des conseils. Ensuite, exécutez votre entrée à travers la grammaire et voir ce qu'il fait.

Un autre indice, pour poser des questions, est d'essayer de réduire votre problème au cas le plus simple qui reproduit l'erreur. Dans le cas de la grammaire ci-dessus, supprimez toutes les règles auxquelles vous ne pensez pas correspondre avant de l'afficher. En outre, publiez un programme complet avec les déclarations %token afin que les utilisateurs puissent le compiler et l'essayer eux-mêmes. Mieux vaut également publier le lexer.