[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: DSL in lua
- From: Vasiliy Tolstov <v.tolstov@...>
- Date: Fri, 7 Dec 2012 12:21:34 +0400
Very interesting solution. Thanks!
2012/12/7 Philipp Janda <siffiejoe@gmx.net>:
> Am 06.12.2012 06:52, schrieb Vasiliy Tolstov:
>>
>> Hello.
>
>
> Hi!
>
>
>> What is the best way to create custom DSL in Lua? Google says, that it
>> can be possible via base lua or using lpeg.
>>
>> I need something like this
>> direcotry "/etc/" {
>> owner "root"
>> group "wheel"
>> mode "0755"
>> action "create"
>> }
>>
>> Can somebody provie minimal lua code for this sample? How can i do
>> this using lua lpeg?
>
>
> Here is a possible solution using LPeg:
> #!/usr/bin/lua
>
> local grammar = require( "grammar" )
>
> local g = grammar.define( function(_ENV)
> local _ = WS^0
> local str_E = (P'"'*C( (ANY-P'"')^0 )*P'"') +
> E"string literal expected"
> local eof = -ANY + E"directory expected"
>
> startrule( "dsl", _ * (V"directory")^0 * eof )
> rule( "directory", W"directory" * _ * (str_E) * _ *
> (P"{"+E"{ expected") * _ *
> (V"owner" + V"group" + V"mode" + V"action")^0 *
> (P"}"+E"owner|group|mode|action|} expected") * _ )
> rule( "owner", W"owner" * _ * (str_E) * _ )
> rule( "group", W"group" * _ * (str_E) * _ )
> rule( "mode", W"mode" * _ * (str_E) * _ )
> rule( "action", W"action" * _ * (str_E) * _ )
> end )
>
>
> local function test( s )
> local ok, ast = pcall( grammar.parsestring, g, s )
> if ok then
> grammar.dumpast( ast )
> else
> print( ast )
> end
> print( ("#"):rep( 80 ) )
> end
>
> test[[
> directory "/etc/" {
>
> owner "root"
> group "wheel"
> mode "0755"
> action "create"
> }
> ]]
>
> test[[
> directory "/etc/" {
> owner "root"
> gruop "wheel"
> mode "0755"
> action "create"
> }
> ]]
>
> But it requires my grammar-module[1] (which is still work-in-progress). If
> you want to use it anyway, consider it MIT-licensed.
>
> [1]: http://lua.siffiejoe.dtdns.net/grammar/grammar.lua
>
> Output is:
> {
> id = dsl, pos = 1
> 1 = {
> id = directory, pos = 1
> 1 = /etc/
> 2 = {
> id = owner, pos = 23
> 1 = root
> }
> 3 = {
> id = group, pos = 38
> 1 = wheel
> }
> 4 = {
> id = mode, pos = 54
> 1 = 0755
> }
> 5 = {
> id = action, pos = 68
> 1 = create
> }
> }
> }
> ################################################################################
> ["directory "/etc/" {\n..."]:3: parse error, owner|group|mode|action|}
> expected
> gruop "wheel"
> ^
> ################################################################################
>
>
> HTH,
> Philipp
>
>
>
>
--
Vasiliy Tolstov,
Clodo.ru
e-mail: v.tolstov@selfip.ru
jabber: vase@selfip.ru