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* }