Ошибка в программе lex? - PullRequest
       21

Ошибка в программе lex?

0 голосов
/ 09 ноября 2009

Я делал эту очень простую программу lex (просто вводная программа). Но при компиляции lex.yy.c я получаю эту ошибку как:

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

Я не смог объяснить причину этой ошибки, так как уже определил top в указанной структуре. Вы видите какую-либо причину для этого?

Код размещен на http://pastebin.com/d5f059c1d

Ответы [ 2 ]

2 голосов
/ 09 ноября 2009

Вот разница с вашим оригиналом. Исправлены все проблемы при компиляции:

--- 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 голосов
/ 09 ноября 2009

Переместить строку 3 в строку 16.

Вам также необходимо удалить инициализаторы из объявлений структуры - по крайней мере, для C (но компилятор C ++ тоже об этом не задумывался).

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

Кому:

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

В действиях вам также нужно объявить 'ch'.

Вам также нужно объявить ваши функции - я сделал их статическими. Это компилирует (при условии, что у вас есть компилятор C99 - указанные инициализаторы не будут работать с компиляторами 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;
}
...