代码之家  ›  专栏  ›  技术社区  ›  mawia

lex程序出错?

lex
  •  0
  • mawia  · 技术社区  · 16 年前

    我正在制作这个非常简单的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’....
    

    http://pastebin.com/d5f059c1d

    2 回复  |  直到 16 年前
        1
  •  0
  •   Jonathan Leffler    16 年前

    这是与你原来的不同之处。它修复了编译时的所有问题:

    --- 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();
    
        2
  •  2
  •   Gonzalo    16 年前

    将第3行移到第16行。

    你还需要从结构声明中删除初始化器——至少对于C来说是这样(但C++编译器也没有太多考虑)。

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

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

    在动作中,您还需要声明“ch”。

    %{
    #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;
    }
    
    推荐文章