93 lines
3.3 KiB
Lua
93 lines
3.3 KiB
Lua
----------------------------------------------------------------------
|
|
-- Metalua: $Id: mlp_table.lua,v 1.5 2006/11/10 02:11:17 fab13n Exp $
|
|
--
|
|
-- Summary: metalua parser, table constructor parser. This is part
|
|
-- of thedefinition of module [mlp].
|
|
--
|
|
----------------------------------------------------------------------
|
|
--
|
|
-- Copyright (c) 2006, Fabien Fleutot <metalua@gmail.com>.
|
|
--
|
|
-- This software is released under the MIT Licence, see licence.txt
|
|
-- for details.
|
|
--
|
|
----------------------------------------------------------------------
|
|
-- History:
|
|
-- $Log: mlp_table.lua,v $
|
|
-- Revision 1.5 2006/11/10 02:11:17 fab13n
|
|
-- compiler faithfulness to 5.1 improved
|
|
-- gg.expr extended
|
|
-- mlp.expr refactored
|
|
--
|
|
-- Revision 1.4 2006/11/09 09:39:57 fab13n
|
|
-- some cleanup
|
|
--
|
|
-- Revision 1.3 2006/11/07 04:38:00 fab13n
|
|
-- first bootstrapping version.
|
|
--
|
|
-- Revision 1.2 2006/11/05 15:08:34 fab13n
|
|
-- updated code generation, to be compliant with 5.1
|
|
--
|
|
----------------------------------------------------------------------
|
|
|
|
--------------------------------------------------------------------------------
|
|
--
|
|
-- Exported API:
|
|
-- * [mlp.table_field()]
|
|
-- * [mlp.table_content()]
|
|
-- * [mlp.table()]
|
|
--
|
|
-- KNOWN BUG: doesn't handle final ";" or "," before final "}"
|
|
--
|
|
--------------------------------------------------------------------------------
|
|
|
|
--require "gg"
|
|
--require "mll"
|
|
--require "mlp_misc"
|
|
|
|
module ("mlp", package.seeall)
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- eta expansion to break circular dependencies:
|
|
--------------------------------------------------------------------------------
|
|
local function _expr (lx) return expr(lx) end
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- [[key] = value] table field definition
|
|
--------------------------------------------------------------------------------
|
|
local bracket_field = gg.sequence{ "[", _expr, "]", "=", _expr, builder = "Pair" }
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- [id = value] or [value] table field definition;
|
|
-- [[key]=val] are delegated to [bracket_field()]
|
|
--------------------------------------------------------------------------------
|
|
function table_field (lx)
|
|
if lx:is_keyword (lx:peek(), "[") then return bracket_field (lx) end
|
|
local e = _expr (lx)
|
|
if lx:is_keyword (lx:peek(), "=") then
|
|
lx:next(); -- skip the "="
|
|
local key = id2string(e)
|
|
local val = _expr(lx)
|
|
local r = { tag="Pair", key, val }
|
|
r.lineinfo = { first = key.lineinfo.first, last = val.lineinfo.last }
|
|
return r
|
|
else return e end
|
|
end
|
|
|
|
local function _table_field(lx) return table_field(lx) end
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- table constructor, without enclosing braces; returns a full table object
|
|
--------------------------------------------------------------------------------
|
|
table_content = gg.list { _table_field,
|
|
separators = { ",", ";" }, terminators = "}", builder = "Table" }
|
|
|
|
local function _table_content(lx) return table_content(lx) end
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- complete table constructor including [{...}]
|
|
--------------------------------------------------------------------------------
|
|
table = gg.sequence{ "{", _table_content, "}", builder = fget(1) }
|
|
|
|
|