Lex and yacc vs GNU readline

Aug 07, 2011 4 Replies

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?


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.

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 andrews@sdf.lonestar.org

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

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 andrews@sdf.lonestar.org

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required