2009-11-09 2 views
0

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

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

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

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

+1

Retagged Лекс, как прогибается тег обычно относится к языку Adobe Flex, а не программа гибкого Unix, которая является для ЛЕКС языка –

+0

@mawia: Вы много обязаны люди принимали ответы и повышали голос. Вы не дали ни одного согласия; вы не дали ни единого голосования (или проголосовавшего). –

ответ

0

Перемещение линии 3 в строке 16.

Кроме того, необходимо удалить инициализаторами из деклараций структуры - по крайней мере, для С (но компилятор C++ не думаю, что много его).

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

To:

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

В действиях, вы также должны объявить 'ч'.

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

Да, я сделал это, но проблема не исчезла !! – mawia

+0

Но ошибки, вероятно, изменились ... в любом случае, есть полная компиляция бит кода, принятая Solaris C++ и GNU GCC. Работает ли это совсем другая проблема. –

+0

Большое спасибо каждому органу за ответ. было ошибкой с моей стороны, чтобы инициализировать переменные внутри декларации структуры. спасибо! – mawia

2

Вот дифф против оригинала. Он фиксирует все проблемы при компиляции:

--- 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

эй почему переопределяет верх внутри структуры. Это, кажется, не делает никакой логики. – mawia

+0

У вас был 'int top = -1;' внутри структуры и что gcc 4.4.1 не удалось скомпилировать программу. Я предполагаю, что вы использовали g ++ или любой другой компилятор C++. – Gonzalo

+0

И это универсальный diff - строка с префиксом '-' удаляется и добавляется строка с префиксом '+'. –

Смежные вопросы