error: initializer element is not constant

Discussion in 'C Programming' started by Bart Vandewoestyne, Oct 3, 2012.

  1. Hello all,

    I am currently trying to get started with the code for Chapter 3
    'Parsing' in Appel's 'Modern Compiler Implementation in C'. After
    downloading the files and fixing some small bugs in it, the only problem
    I'm left with when typing 'make' is the following error:

    cc -g -c lex.yy.c
    lex.yy.c:20:1: error: initializer element is not constant
    lex.yy.c:20:1: error: (near initialization for ‘yyin’)
    lex.yy.c:20:1: error: initializer element is not constant
    lex.yy.c:20:1: error: (near initialization for ‘yyout’)
    make: *** [lex.yy.o] Error 1

    The file lex.yy.c is an output file of an old version of lex, and the
    error is for the line:

    FILE *yyin = {stdin}, *yyout = {stdout};

    I would now like to know what is the cleanest way to solve this
    compilation error. From the net, I've found that I can simply declare
    yyin and yyout:

    FILE *yyin, *yyout;

    (which works), and then later initialize them in a main(), probably
    something like:

    int main()
    {
    yyin = stdin;
    yyout = stdout;
    }

    However, i don't have a main function, so I was wondering where and how
    I should initialize yyin and yyout. My educated guess is that this
    should happen at the beginning of the yylex() function. So there, I added:

    yylex() {
    int nstr; extern int yyprevious;
    yyin = stdin; yyout = stdout;
    ... other code...

    See also lines 20-21 and 78-79 in
    https://github.com/BartVandewoestyn..._Compiler_Implementation_in_C/chap03/lex.yy.c

    Is this the correct, cleanest and most portable way to fix the above error?

    Thanks,
    Bart
     
    Bart Vandewoestyne, Oct 3, 2012
    #1
    1. Advertising

  2. Bart Vandewoestyne

    Eric Sosman Guest

    On 10/3/2012 9:16 AM, Bart Vandewoestyne wrote:
    > Hello all,
    >
    > I am currently trying to get started with the code for Chapter 3
    > 'Parsing' in Appel's 'Modern Compiler Implementation in C'. After
    > downloading the files and fixing some small bugs in it, the only problem
    > I'm left with when typing 'make' is the following error:
    >
    > cc -g -c lex.yy.c
    > lex.yy.c:20:1: error: initializer element is not constant
    > lex.yy.c:20:1: error: (near initialization for ‘yyin’)
    > lex.yy.c:20:1: error: initializer element is not constant
    > lex.yy.c:20:1: error: (near initialization for ‘yyout’)
    > make: *** [lex.yy.o] Error 1
    >
    > The file lex.yy.c is an output file of an old version of lex, and the
    > error is for the line:
    >
    > FILE *yyin = {stdin}, *yyout = {stdout};
    >
    > I would now like to know what is the cleanest way to solve this
    > compilation error. From the net, I've found that I can simply declare
    > yyin and yyout:
    >
    > FILE *yyin, *yyout;
    >
    > (which works), and then later initialize them in a main(), probably
    > something like:
    >
    > int main()
    > {
    > yyin = stdin;
    > yyout = stdout;
    > }
    >
    > However, i don't have a main function, [...]


    Really? C'mon, now: REALLY?

    > [...] so I was wondering where and how
    > I should initialize yyin and yyout. My educated guess is that this
    > should happen at the beginning of the yylex() function. So there, I added:
    >
    > yylex() {
    > int nstr; extern int yyprevious;
    > yyin = stdin; yyout = stdout;
    > ... other code...
    >
    > See also lines 20-21 and 78-79 in
    > https://github.com/BartVandewoestyn..._Compiler_Implementation_in_C/chap03/lex.yy.c
    >
    >
    > Is this the correct, cleanest and most portable way to fix the above error?


    A good first step might be to discard the "old version of lex"
    and see whether a more up-to-date version generates code that needs
    less fixing. You might also consider using a lex-ish program like
    flex instead of Original Model T lex.

    If that doesn't help, then you need to ensure that yyin and yyout
    are initialized at some point before their first uses. Off-hand I don't
    know whether yylex() is the best place for this; maybe it should be
    done in yylex()'s caller (where, for example, you might call fopen()
    to use streams other than stdin and stdout).

    --
    Eric Sosman
    d
     
    Eric Sosman, Oct 3, 2012
    #2
    1. Advertising

  3. On 10/03/2012 03:35 PM, Eric Sosman wrote:
    >
    > A good first step might be to discard the "old version of lex"
    > and see whether a more up-to-date version generates code that needs
    > less fixing. You might also consider using a lex-ish program like
    > flex instead of Original Model T lex.


    Hmm... you're probably right. The code compiles now, but when I run the
    parser it gets stuck in the yylook() function for some or the other
    reason... If I compile with -Wall and -Wextra, then I see quite some
    warnings...

    If I use my own lex.yy.c file (that I obtained while writing the lexer
    from Chapter 2 of the book), it just works... so I'll stick with that one.

    The reason why I was trying to use the book's lex.yy.c is simply because
    I really wanted to use the author's lexer instead of mine (mine might
    still contain errors...)

    But anyway, given the too old lex.yy.c and the problems that come with
    it, I guess I'll have to have faith in myself and use my own lexer.

    Regards,
    Bart
     
    Bart Vandewoestyne, Oct 3, 2012
    #3
  4. Bart Vandewoestyne

    Chad Guest

    Maybe it's just me, but I feel the parser is more difficult to get right than the lexer. In particular, depending on how you handle the AST, you mighthave to use some kind of backtracking algorithm in order to generate the correct error message. Also, if I remember right, certain parsing techniquescan make a programming language more expressive.
     
    Chad, Oct 3, 2012
    #4
  5. Bart Vandewoestyne <> writes:
    > I am currently trying to get started with the code for Chapter 3
    > 'Parsing' in Appel's 'Modern Compiler Implementation in C'. After
    > downloading the files and fixing some small bugs in it, the only problem
    > I'm left with when typing 'make' is the following error:
    >
    > cc -g -c lex.yy.c
    > lex.yy.c:20:1: error: initializer element is not constant
    > lex.yy.c:20:1: error: (near initialization for ‘yyin’)
    > lex.yy.c:20:1: error: initializer element is not constant
    > lex.yy.c:20:1: error: (near initialization for ‘yyout’)
    > make: *** [lex.yy.o] Error 1
    >
    > The file lex.yy.c is an output file of an old version of lex, and the
    > error is for the line:
    >
    > FILE *yyin = {stdin}, *yyout = {stdout};


    Apparently lex is assuming that stdin and stdout are constant
    expressions. This is likely true for some implementations,
    presumably including the ones on which lex was originally developed,
    but it's not guaranteed.

    > I would now like to know what is the cleanest way to solve this
    > compilation error. From the net, I've found that I can simply declare
    > yyin and yyout:
    >
    > FILE *yyin, *yyout;
    >
    > (which works), and then later initialize them in a main(), probably
    > something like:
    >
    > int main()
    > {
    > yyin = stdin;
    > yyout = stdout;
    > }
    >
    > However, i don't have a main function, so I was wondering where and how
    > I should initialize yyin and yyout.


    You should have a main function *somewhere*.

    > My educated guess is that this
    > should happen at the beginning of the yylex() function. So there, I added:
    >
    > yylex() {
    > int nstr; extern int yyprevious;
    > yyin = stdin; yyout = stdout;
    > ... other code...


    Can you create an initialization function that assigns values to yyin
    and yyout, and require that the main program (wherever it is) must call
    that function?

    > See also lines 20-21 and 78-79 in
    > https://github.com/BartVandewoestyn..._Compiler_Implementation_in_C/chap03/lex.yy.c
    >
    > Is this the correct, cleanest and most portable way to fix the above error?


    That file no longer exists. The version I think you're referring to can
    be seen at

    https://github.com/BartVandewoestyn..._Compiler_Implementation_in_C/chap03/lex.yy.c

    The file lex.yy.c is normally *generated* from an input file. Your
    makefile assumes that it already exists.

    GNU flex is a relatively newer implementation of lex, and it should be
    reasonable compatible. I just tried feeding your "tiger.lex" file to
    yacc, and it generated a lex.yy.c file that doesn't have the problem you
    reported. It has:

    if ( ! yyin )
    yyin = stdin;

    if ( ! yyout )
    yyout = stdout;

    --
    Keith Thompson (The_Other_Keith) <http://www.ghoti.net/~kst>
    Will write code for food.
    "We must do something. This is something. Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
     
    Keith Thompson, Oct 3, 2012
    #5
  6. Bart Vandewoestyne

    Nobody Guest

    On Wed, 03 Oct 2012 13:56:23 -0700, Keith Thompson wrote:

    >> However, i don't have a main function, so I was wondering where and how
    >> I should initialize yyin and yyout.

    >
    > You should have a main function *somewhere*.


    It might be the one in libfl.a (or libfl_pic.a).
     
    Nobody, Oct 4, 2012
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Todd Nathan

    Error: "initializer element is not constant"

    Todd Nathan, Jul 30, 2003, in forum: C Programming
    Replies:
    2
    Views:
    19,470
    Kevin Easton
    Jul 30, 2003
  2. Levi Campbell
    Replies:
    3
    Views:
    425
    Flash Gordon
    Feb 11, 2006
  3. Replies:
    3
    Views:
    656
    Wade Ward
    Oct 21, 2007
  4. Gowtham
    Replies:
    16
    Views:
    824
    Szabolcs Borsanyi
    May 9, 2008
  5. TheFlyingDutchman

    Tiny C error - initializer element is not constant

    TheFlyingDutchman, Jan 25, 2011, in forum: C Programming
    Replies:
    4
    Views:
    1,008
    TheFlyingDutchman
    Jan 25, 2011
Loading...

Share This Page