plua 0.1.0

Lua preprocessor inspired by Nelua
Documentation
Program = _{ SOI ~ Content* ~ EOI }

Content = _{ Meta | Lua+ | EOL }

Lua = { LuaChar+ }

LuaChar = _{ !Reserved ~ ANY }

Reserved = { MetaReserved | MetaCodeBlockPrefix | MetaCodeBlockSuffix }

MetaReserved = {
    MetaCodeMultiPrefix
  | MetaCodeMultiSuffix
  | MetaIncludePrefix
  | MetaCodeSinglePrefix
  | MetaValueInterpolatePrefix
  | MetaValueInterpolateSuffix
  | MetaExpressionInterpolatePrefix
  | MetaExpressionInterpolateSuffix
}

EOL = _{ "\n" | "\r\n" }

End = { EOL | &EOI }

Character = _{ !(EOL | Reserved) ~ ANY }

Quote = _{ "\"" }

Meta = _{
    &"#" ~ (MetaInclude | MetaCode | MetaValueInterpolate | MetaExpressionInterpolate)
}

MetaInclude = _{ MetaIncludePrefix ~ Quote ~ MetaIncludeFile ~ Quote ~ End }

MetaIncludePrefix = _{ "##!include " }

MetaIncludeFile = { (!Quote ~ Character)* }

MetaCode = _{ &"##" ~ (MetaCodeMulti | MetaCodeSingle) }

MetaCodeMulti = _{ MetaCodeMultiPrefix ~ MetaCodeMultiBody* ~ MetaCodeMultiSuffix }

MetaCodeMultiPrefix = _{ "##[[" }

MetaCodeMultiSuffix = _{ "]]" }

MetaCodeMultiBody = { MetaCodeBlock | LuaChar+ }

MetaCodeSingle = _{ MetaCodeSinglePrefix ~ MetaCodeSingleBody* ~ End }

MetaCodeSinglePrefix = _{ "##" }

MetaCodeSingleBody = { MetaCodeBlock | Character+ }

MetaCodeBlock = _{ MetaCodeBlockPrefix ~ (MetaCodeBlockBody | MetaValueInterpolate | MetaExpressionInterpolate)* ~ MetaCodeBlockSuffix }

MetaCodeBlockPrefix = _{ "#{" }

MetaCodeBlockSuffix = _{ "}#" }

MetaCodeBlockBody = { LuaChar+ }

MetaValueInterpolate = _{ MetaValueInterpolatePrefix ~ MetaValueInterpolateBody ~ MetaValueInterpolateSuffix }

MetaValueInterpolatePrefix = _{ "#[" }

MetaValueInterpolateSuffix = _{ "]#" }

MetaValueInterpolateBody = { LuaChar* }

MetaExpressionInterpolate = _{ MetaExpressionInterpolatePrefix ~ MetaExpressionInterpolateBody ~ MetaExpressionInterpolateSuffix }

MetaExpressionInterpolatePrefix = _{ "#|" }

MetaExpressionInterpolateSuffix = _{ "|#" }

MetaExpressionInterpolateBody = { LuaChar* }