[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Controlling the lexer
- From: Luiz Henrique de Figueiredo <lhf@...>
- Date: Tue, 7 Jun 2005 21:39:24 -0300
> I am piecing together a large string for evaluation by lua_buffer()
> and would like to include the equivalent of the C preprocessor
> #line directive. I can easily add special comments to the string,
> and intercept them in a chunk reader, but as far as I can see,
> there is no way to access the lexer state without replacing llex.c.
This seems a reasonable requirement, but it's hard to provide access to
the line number counter in the lexer because it's stored in a private
struct that the chunk reader has not access to. Sorry.
Try adding the (tested!) code below just after the #includes in lparser.c.
This will add line directives in the form "$ NUMBER" with minimal impact
on the core code.
static int luaY_lex(LexState *ls, SemInfo *seminfo)
{
int c=luaX_lex(ls,seminfo);
if (c!='$') return c;
c=luaX_lex(ls,seminfo);
if (c!=TK_NUMBER) return '$';
ls->linenumber=(int)seminfo->r;
return luaX_lex(ls,seminfo);
}
#define luaX_lex luaY_lex
(You can even save those lines to myline.c and add #include "myline.c"
in lparser.c in the proper place. This will allow you to easily patch
future versions, if needed.)
Enjoy.
--lhf