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?
Lex and yacc vs GNU readline
Aug 07, 2011
4 Replies
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