]> git.lizzy.rs Git - metalua.git/blob - src/compiler/mlp_table.lua
minor stuff
[metalua.git] / src / compiler / mlp_table.lua
1 ----------------------------------------------------------------------
2 -- Metalua:  $Id: mlp_table.lua,v 1.5 2006/11/10 02:11:17 fab13n Exp $
3 --
4 -- Summary: metalua parser, table constructor parser. This is part 
5 --   of thedefinition of module [mlp].
6 --
7 ----------------------------------------------------------------------
8 --
9 -- Copyright (c) 2006, Fabien Fleutot <metalua@gmail.com>.
10 --
11 -- This software is released under the MIT Licence, see licence.txt
12 -- for details.
13 --
14 ----------------------------------------------------------------------
15 -- History:
16 -- $Log: mlp_table.lua,v $
17 -- Revision 1.5  2006/11/10 02:11:17  fab13n
18 -- compiler faithfulness to 5.1 improved
19 -- gg.expr extended
20 -- mlp.expr refactored
21 --
22 -- Revision 1.4  2006/11/09 09:39:57  fab13n
23 -- some cleanup
24 --
25 -- Revision 1.3  2006/11/07 04:38:00  fab13n
26 -- first bootstrapping version.
27 --
28 -- Revision 1.2  2006/11/05 15:08:34  fab13n
29 -- updated code generation, to be compliant with 5.1
30 --
31 ----------------------------------------------------------------------
32
33 --------------------------------------------------------------------------------
34 --
35 -- Exported API:
36 -- * [mlp.table_field()]
37 -- * [mlp.table_content()]
38 -- * [mlp.table()]
39 --
40 -- KNOWN BUG: doesn't handle final ";" or "," before final "}"
41 --
42 --------------------------------------------------------------------------------
43
44 --require "gg"
45 --require "mll"
46 --require "mlp_misc"
47
48 module ("mlp", package.seeall)
49
50 --------------------------------------------------------------------------------
51 -- eta expansion to break circular dependencies:
52 --------------------------------------------------------------------------------
53 local function _expr (lx) return expr(lx) end
54
55 --------------------------------------------------------------------------------
56 -- [[key] = value] table field definition
57 --------------------------------------------------------------------------------
58 local bracket_field = gg.sequence{ "[", _expr, "]", "=", _expr, builder = "Pair" }
59
60 --------------------------------------------------------------------------------
61 -- [id = value] or [value] table field definition;
62 -- [[key]=val] are delegated to [bracket_field()]
63 --------------------------------------------------------------------------------
64 function table_field (lx)
65    if lx:is_keyword (lx:peek(), "[") then return bracket_field (lx) end
66    local e = _expr (lx)
67    if lx:is_keyword (lx:peek(), "=") then 
68       if e.tag ~= 'Id' then _G.table.print(e,80) end
69       assert (e.tag == "Id", "Identifier required on the left of = in table")
70       lx:next(); return {tag="Pair", {tag="String", e[1]}, _expr(lx)} 
71    else return e end
72 end
73
74 local function _table_field(lx) return table_field(lx) end
75
76 --------------------------------------------------------------------------------
77 -- table constructor, without enclosing braces; returns a full table object
78 --------------------------------------------------------------------------------
79 table_content = gg.list { _table_field, 
80    separators = { ",", ";" }, terminators = "}", builder = "Table" }
81
82 local function _table_content(lx) return table_content(lx) end
83
84 --------------------------------------------------------------------------------
85 -- complete table constructor including [{...}]
86 --------------------------------------------------------------------------------
87 table = gg.sequence{ "{", _table_content, "}", builder = fget(1) }
88
89