Reply by Andrew Smallshaw●August 8, 20112011-08-08
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
Reply by George Neuner●August 8, 20112011-08-08
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
Reply by Andrew Smallshaw●August 7, 20112011-08-07
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
Reply by Nobody●August 7, 20112011-08-07
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.
Reply by Neil McNulty●August 7, 20112011-08-07
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?