1. This forum section is a read-only archive which contains old newsgroup posts. If you wish to post a query, please do so in one of our main forum sections (here). This way you will get a faster, better response from the members on Motherboard Point.

Lex and yacc vs GNU readline

Discussion in 'Embedded' started by Neil McNulty, Aug 7, 2011.

  1. Neil McNulty

    Neil McNulty Guest

    I can't find anything online about using GNU readline as a front end
    for an interactive parser using lex and yacc. I would have thought
    this would be a fairly common thing to do. Does anyone know how I
    might do this?
     
    Neil McNulty, Aug 7, 2011
    #1
    1. Advertisements

  2. Neil McNulty

    Nobody Guest

    Simplified version:

    #define YY_INPUT(buf,result,max_size) result = get_input(buf, max_size);

    static int get_input(char *buf, int size)
    {
    char *line;
    if (feof(yyin))
    return YY_NULL;
    line = readline("> ");
    if (!line)
    return YY_NULL;
    if (strlen(line) > size - 2) {
    error("input line too long");
    return YY_NULL;
    }
    strcpy(buf, line);
    strcat(buf, "\n");
    free(line);
    add_history(buf);

    return strlen(buf);
    }

    A more complex version would avoid the "line too long" error.
     
    Nobody, Aug 7, 2011
    #2
    1. Advertisements

  3. Yacc is nothing to do with it: readline will be talking to lex and
    only to lex. What lex then talks to is an irrelevance.

    However, this kind of thing is difficult to impossible to implement
    using a generic lex that expects input via a file. Input from a
    buffer is not standardised, so you really need to use the specific
    mechanism of whatever lex you are using.

    Flex, for example, allows you to define a YY_INPUT macro (which will
    probably end up as a wrapper around a function) to copy from the
    buffer returned by readline() into the destination buffer indicated
    as a macro parameter.

    There are a few gotchas to watch - the history needs maintaining
    manually and readline annoyingly strips newlines before you see them
    - but it is all relatively easily contained in the definitions
    section of your lexer (the bit between %{ and %} ). I did this a
    few months ago - it shouldn't be too difficult to find if you want
    a concrete example.
     
    Andrew Smallshaw, Aug 7, 2011
    #3
  4. One further "gotcha" (if it matters) is that GNU readline is that,
    although a library, readline is not licenced under LGPL but is instead
    a viral component licensed under GPL v3.

    George
     
    George Neuner, Aug 8, 2011
    #4
  5. If that is an issue there is always libedit, which ISTR originates
    as part of the NetBSD distribution. That is source-compatible with
    GNU readline but BSD licensed. Only half the size too.
     
    Andrew Smallshaw, Aug 8, 2011
    #5
    1. Advertisements

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.