2009-11-09 7 views
0

Je faisais ce programme lex très simple (juste un programme d'introduction). Mais sur la compilation lex.yy.c, je reçois cette erreur:Erreur dans le programme lex?

inToPostfix.l:26: error: ‘struct stackoperand’ has no member named ‘top’ 
inToPostfix.l:32: error: ‘struct stackoperator’ has no member named ‘top’.... 

Je ne pouvais faire aucune raison de cette erreur comme je l'ai déjà défini haut dans la structure spécifiée. Pouvez-vous voir une raison pour cela?

Code est à http://pastebin.com/d5f059c1d

+1

Retagged à lex, comme la balise flex se réfère normalement à la langue Adobe Flex et non le flex programme unix qui est la langue lex –

+0

@mawia: vous devez beaucoup de les gens ont accepté les réponses, et les votes positifs aussi. Vous n'avez pas donné un seul et unique vous n'avez pas donné une seule mise à jour (ou un vote négatif). –

Répondre

0

Déplacer la ligne 3 à la ligne 16.

Vous devez également supprimer les initialiseurs des déclarations de structure - au moins pour C (mais le compilateur C++ ne pense pas beaucoup de lui non plus).

struct stackoperator 
{ 
char stack[10]; 
int top =-1; 
}; 

Pour:

struct stackoperator 
{ 
char stack[10]; 
int top; 
}; 

Dans les actions, vous devez également déclarer 'ch'.

Vous devez également déclarer vos fonctions - je les ai rendues statiques. Cette compile (en supposant que vous avez un compilateur C99 - les initialiseurs désignés ne fonctionneront pas avec les compilateurs de C89):

%{ 
#include<stdio.h> 

struct stackoperator 
{ 
char stack[10]; 
int top; 
}; 

struct stackoperand 
{ 
int stack[10][2]; 
int top; 
}; 
struct stackoperator operator = { .top = -1 }; 
struct stackoperand operand = { .top = -1 }; 
int num=0; 
static void push(int num,int flag); 
static int pop(void); 
static int precedence(char a,char b); 
%} 

%% 

[0-9] {num=num*10+(*yytext-'0');push(num,1);} 
[-+*/] { 
     if(precedence(operator.top,*yytext)) { 
      char ch=pop(); 
      push(ch,0); 
      operand.stack[operand.top][1]=1; 
     } 
     push(*yytext,0); 
    } 
[ \t] ; 
[\n]  { 
     char ch; 
     while(operator.top!=-1) 
     { 
      ch=pop(); 
      push(ch,0); 
     } 
     int i=0; 
     while(i<=operand.top) 
     { 
      if(operand.stack[operand.top][1]==1) 
       printf(" %c ",operand.stack[operand.top][0]); 
      else 
       printf(" %d ",operand.stack[operand.top][0]); 
     } 
    } 
%% 

static void push(int num,int flag) 
{ 
    if(flag) 
    {  operand.top++; 
     operand.stack[operand.top][0]=num; 
     operand.stack[operand.top][1]=0; 
    } 
    else 
     operator.stack[++operator.top]=num; 
} 

static int pop(void) 
{ 
    return operator.stack[operator.top--]; 
} 

static int precedence(char a,char b) 
{ 
    if(operator.top==-1) 
     return 0; 

    if((a=='*'||a=='/') && (b=='+'||b=='-')) 
     return 1; 
    else 
     return 0; 
} 
+0

ouais je l'avais fait mais le problème a persisté !! – mawia

+0

Mais les erreurs ont probablement changé ... de toute façon, il y a un code de compilation complet - accepté par Solaris C++ et GNU GCC. Que cela fonctionne est une autre question tout à fait. –

+0

Merci beaucoup à tous pour votre réponse. c'était une erreur de ma part d'initialiser les variables à l'intérieur de la déclaration de structure. merci! – mawia

2

Voici une diff contre votre original. Elle corrige tous les problèmes lors de la compilation:

--- orig.l  2009-11-09 14:55:47.414002041 -0500 
+++ kk.l  2009-11-09 14:54:53.386385539 -0500 
@@ -1,14 +1,15 @@ 
%{ 
    #include<stdio.h> 
%} 
+  int precedence(char a,char b); 
     struct stackoperator{ 
       char stack[10]; 
-    int top =-1; 
+    int top; 
     }; 

     struct stackoperand{ 
       int stack[10][2]; 
-    int top =-1; 
+    int top; 
     }; 
     struct stackoperator operator; 
     struct stackoperand operand; 
@@ -29,6 +30,7 @@ 
     } 
[ \t] ; 
[\n]  { 
+    char ch; 
       while(operator.top!=-1) 
       { 
         ch=pop(); 
+0

hey pourquoi redéfinir le top à l'intérieur de la structure.il ne semble pas faire de logique. – mawia

+0

Vous avez eu 'int top = -1;' à l'intérieur de la structure et que gcc 4.4.1 a échoué à compiler le programme. Je suppose que vous utilisiez g ++ ou tout autre compilateur C++. – Gonzalo

+0

Et c'est un diff universel - la ligne préfixée '-' est supprimée et la ligne préfixée '+' est ajoutée. –

Questions connexes