[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Fsyntax is ready (...but messing with syntax sucks! :)
- From: Asko Kauppi <askok@...>
- Date: Wed, 6 Dec 2006 00:55:02 +0200
I got the syntax-aware filtering done, and as a sample below is the
code required to have "do ... end" be paranthesless function parameters.
So far, so good.
Selftests run, as long as a script don't have "for i=1,h do .." or
similar while constructs. :)) Sad. Funny.
The point is, there is now a slimmer (?) alternative for MetaLua, but
messing with existing syntax is sure to have surprising concequences,
all of which are not immediately obvious. Roberto et.al. have known
this all the time, of course... Good for them.
http://kotisivu.dnainternet.fi/askok/bin/Filters-061206.zip
-rw-r--r-- 1 asko staff 550 Dec 6 00:22 Makefile
-rw-r--r-- 1 asko staff 5060 Dec 6 00:40 fdoend.lua
-rw-r--r-- 1 asko staff 12510 Dec 5 23:52 fluax.lua
-rw-r--r-- 1 asko staff 19283 Dec 6 00:23 fsyntax.lua
-rw-r--r-- 1 asko staff 13664 Dec 6 00:09 ftools.lua
-rw-r--r-- 1 asko staff 661 Dec 5 23:53 test-fdoend.lua
Please download it.
usage: make
make speed
requires:
Lua 5.1 with token filter patch applied
If this was added with a tokenizer, and code generator, it could be
any syntax engine. I have no interest to go further that road. But
someone might? :)
-asko
-----
-- FDOEND.LUA
--
-- exp do .. end --> exp ( function() .. end )
--
-- usage: lua -lftools -lfsyntax -lfdoend ...
--
local alt= assert( FILTER.syntax.alt )
local altN_but_last= assert( FILTER.syntax.altN_but_last )
local opt= assert( FILTER.syntax.opt )
local args= assert( FILTER.syntax.args )
local block= assert( FILTER.syntax.block )
local exp= assert( FILTER.syntax.exp )
local explist1= assert( FILTER.syntax.explist1 )
local fieldlist= assert( FILTER.syntax.fieldlist )
local funcbody= assert( FILTER.syntax.funcbody )
local var= assert( FILTER.syntax.var )
local function CATCH( p, first )
p:replace( first-1, 1, "(", "function", "(", ")" ) -- beginning
p:replace( 0, 0, ")" ) -- after
end
local function CATCH2( p, first )
p:replace( first-1, 0, "(" ) -- beginning
p:replace( 0, 0, ")" ) -- after
end
FILTER.syntax.link{
["functioncall"]= { -- prefixexp
alt{ ['(']= {exp,')'},
["<name>"]=true },
altN_but_last{ ['[']= {exp,']'},
['.']= "<name>",
["do"]= { block, "end",
convert=CATCH },
["function"]= { funcbody,
convert=CATCH2 },
[':']= {"<name>",args},
args },
-- end of prefixexp
opt{':',"<name>"},
args
},
["args"]= alt{ ['(']= { opt(explist1), ')' },
["<string>"]= true,
['{']= {opt(fieldlist),'}'},
["do"]= { block, "end", convert=CATCH },
["function"]= { funcbody, convert=CATCH2 },
},
}