EmbeddedRelated.com
Forums
The 2024 Embedded Online Conference

Lex and yacc vs GNU readline

Started by Neil McNulty August 7, 2011
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?
On Sat, 06 Aug 2011 21:01:54 -0700, Neil McNulty wrote:

> 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.
On 2011-08-07, Neil McNulty <mcnultyneil@ymail.com> wrote:
> 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?
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
On Sun, 7 Aug 2011 06:25:17 +0000 (UTC), Andrew Smallshaw
<andrews@sdf.lonestar.org> wrote:

>On 2011-08-07, Neil McNulty <mcnultyneil@ymail.com> wrote: >> I can't find anything online about using GNU readline as a front end > >There are a few gotchas to watch ...
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
On 2011-08-08, George Neuner <gneuner2@comcast.net> wrote:
> On Sun, 7 Aug 2011 06:25:17 +0000 (UTC), Andrew Smallshaw ><andrews@sdf.lonestar.org> wrote: > >>On 2011-08-07, Neil McNulty <mcnultyneil@ymail.com> wrote: >>> I can't find anything online about using GNU readline as a front end >> >>There are a few gotchas to watch ... > > 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.
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

The 2024 Embedded Online Conference