-------------------------------------------------------------------------------- -- Copyright (c) 2006-2013 Fabien Fleutot and others. -- -- All rights reserved. -- -- This program and the accompanying materials are made available -- under the terms of the Eclipse Public License v1.0 which -- accompanies this distribution, and is available at -- http://www.eclipse.org/legal/epl-v10.html -- -- This program and the accompanying materials are also made available -- under the terms of the MIT public license which accompanies this -- distribution, and is available at http://www.lua.org/license.html -- -- Contributors: -- Fabien Fleutot - API and implementation -- -------------------------------------------------------------------------------- require 'checks' local gg = require 'metalua.grammar.generator' local M = { } local unpack = table.unpack or unpack function M.opt(mlc, primary, a_type) checks('table', 'table|function', 'string') return gg.sequence{ primary, gg.onkeyword{ "#", function() return assert(mlc.annot[a_type]) end }, builder = function(x) local t, annot = unpack(x) return annot and { tag='Annot', t, annot } or t end } end -- split a list of "foo" and "`Annot{foo, annot}" into a list of "foo" -- and a list of "annot". -- No annot list is returned if none of the elements were annotated. function M.split(lst) local x, a, some = { }, { }, false for i, p in ipairs(lst) do if p.tag=='Annot' then some, x[i], a[i] = true, unpack(p) else x[i] = p end end if some then return x, a else return lst end end return M