Pergunta

eu estava fazendo este programa lex muito simples (apenas um programa introdutório). Mas na compilação lex.yy.c, eu estou recebendo este erro como:

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

Eu não poderia fazer qualquer razão para este erro como já definido superior na estrutura especificada. você pode ver qualquer razão para isso?

código é publicado em http://pastebin.com/d5f059c1d

Foi útil?

Solução

linha Mover 3 a linha 16.

Você também precisa remover as initializers das declarações estrutura -. Pelo menos para C (mas o compilador C ++ não acho que muito do que quer)

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

Para:

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

Nas ações, você também precisa declarar 'ch'.

Você também precisa declarar suas funções - Eu os fiz estática. Isso compila (supondo que você tem um compilador C99 - os inicializadores designados não vai trabalhar com compiladores 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;
}

Outras dicas

Aqui é um diff contra o seu original. Ela corrige todos os problemas quando compilar:

--- 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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top