Files
plainleaf/client/space_lua/parse-lua.js
T
5996e51c6f [LIQ] Unify from, select, and group by clauses to use field lists, implement multi-source cross-join (#1909)
* Website: Make manual build ref configurable

* [LIQ] Unify `from`, `select`, and `group by` clauses to use field lists

Query clauses `from`, `select`, and `group by` now accept the same field
syntax as Lua table constructors (`name = expr`, bare expr, or `[expr]
= expr`), giving them a consistent grammar and enabling named bindings
everywhere. #feature

What changed:

* New `FieldList` rule in `lua.grammar`. All three clauses now parse
  their arguments through it instead of using expression lists or the
  special `Name "=" exp` pattern.

* AST types `LuaFromClause`, `LuaSelectClause`, and `LuaGroupByClause`
  now carry fields: `LuaTableField[]` instead of a single expression or
  an expression array. The parser, static analysis helpers and the
  evaluator are all updated to work with this new shape.

Named bindings in `select`
--------------------------
`select name, age` now derives column names from bare variable or
property access expressions so the result table has string keys (`name`,
`age`) rather than integer indices. Explicit naming still works.

Named bindings in `group by`
----------------------------
`group b`y fields can carry explicit aliases that propagate into the
post-grouping scope. For example:

```sql
group by
  n = name
select {
  label = n
}
```

The alias `n` is now visible in `select`, `having`, and `order by`.
Previously only the raw expression form (`name`) was bound and an
explicit alias was silently lost. #bugfix

A new `LuaGroupByEntry` type pairs each `group by` expression with its
optional alias. The environment builder binds every
declared alias to the corresponding key value, regardless of whether the
group key is a scalar or a multi-key table.

Named bindings in `from`
------------------------
`from p = page` continues to work as before. The clause now also accepts
the full field-list syntax which lays the groundwork for multi-source
from (cross join) in a future change. #todo #feature

Complete LIQ syntax now
-----------------------
Complete LIQ syntax (in Postgres documentation style) could be now
roughly expressed as follows: #todo #documentation

```text
query[[ clause [...] ]]

where clause is one of:

    FROM field [, ...]
    WHERE condition
    GROUP BY field [, ...]
    HAVING condition
    SELECT field [, ...]
    ORDER BY sort_key [, ...]
    LIMIT count [, offset]
    OFFSET start

where field is one of:

    expression
    name = expression
    [expression] = expression

where sort_key is:

    expression [ ASC | DESC ]
               [ NULLS { FIRST | LAST } ]
               [ USING name ]
               [ USING FUNCTION function_body ]

where expression is any valid Lua expression, including:

    aggregate_call
    aggregate_call FILTER ( WHERE condition )
```

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

* Fix type error caused by earlier merge conflict resolution

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

* [LIQ] Cross-join support for multi-source `from`

Examples of what works now:

```
${query [[
  from
    x = {   1,   2 },
    y = {  10,  20 },
    z = { 100, 200 }
  select {
    sum = x + y + z
  }
]]}
```

Or (more complicated three-way cross-join) to illustrate:

```
${query [[
  from
    s = {
      { id = 1, name = 'Eva',  },
      { id = 2, name = 'Adam', },
      { id = 3, name = 'John', },
      { id = 4, name = 'Zef',  },
    },
    c = {
      { id = 101, title = 'Mathematics',      },
      { id = 102, title = 'Arts',             },
      { id = 103, title = 'Physics',          },
      { id = 104, title = 'Computer Science', },
      { id = 105, title = 'Literature',       },
    },
    e = {
      { sid = 1, cid = 101, },
      { sid = 1, cid = 103, },
      { sid = 2, cid = 101, },
      { sid = 2, cid = 102, },
      { sid = 2, cid = 103, },
      { sid = 3, cid = 102, },
      { sid = 3, cid = 105, },
      { sid = 4, cid = 101, },
      { sid = 4, cid = 103, },
      { sid = 4, cid = 104, },
    }
  where
    s.id  == e.sid and
    e.cid == c.id
  order by
    s.name
  group by
    s.name
  having
    s.name:match('^A') or
    s.name:match('f$')
  select
    student = s.name:upper(),
    courses = string_agg(c.title, ', '
      order by c.title desc
    )
]]}
```

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

---------

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
Co-authored-by: Zef Hemel <zef@zef.me>
2026-03-25 14:48:57 +01:00

23 lines
18 KiB
JavaScript

// This file was generated by lezer-generator. You probably shouldn't edit it.
import {LRParser} from "@lezer/lr"
const spec_identifier = {__proto__:null,break:16, goto:20, do:24, end:26, while:30, nil:32, true:34, false:36, order:81, by:83, desc:87, asc:89, using:90, function:92, nulls:99, first:101, last:103, or:106, and:108, not:130, query:142, from:149, where:155, select:161, limit:165, offset:169, group:173, having:177, filter:181, repeat:184, until:186, if:190, then:192, elseif:194, else:196, for:200, in:208, local:218, return:234}
export const parser = LRParser.deserialize({
version: 14,
states: "LQO!ZQPOOOOQO'#Cc'#CcO!UQPO'#CaO!bQPOOOOQO'#F]'#F]O!vQQO'#CwO$]QPO'#F[OOQO'#F['#F[O$gQPO'#F[OOQO'#Eo'#EoO%vQPO'#EnOOQO'#FW'#FWOOQO'#Ev'#EvO%{QPO'#C_OOQO'#C_'#C_QOQPOOO!UQPO'#CeO&`QPO'#CgO!vQQO'#CjO&gQPO'#EZO!vQQO'#E^O!UQPO'#EcO!UQPO'#EjO&nQPO'#EpO&vQQO'#EtO'^QPO,58{OOQO'#Cq'#CqO!UQPO,59^O!vQQO,59`O(gQQO'#C|O(nQQO'#FbOOQO'#F^'#F^OOQO,59f,59fO!UQPO,59fO(xQPO'#FYO,wQPO,59cO-OQPO'#F[OOQO'#Dp'#DpOOQO'#Dq'#DqOOQO'#Dr'#DrO!vQQO'#DnOOQO'#FY'#FYO/|QPO'#DsO0RQSO'#DtO0WQPO'#FQO0`QPO,5<bO!vQQO,5;YOOQO-E8t-E8tOOQO,58y,58yOOQO,59P,59PO0hQPO,59RO0mQPO,59UO0tQPO,5:uO0yQPO,5:xO1QQPO'#FuOOQO'#Eg'#EgO1]QPO'#EfO1bQPO,5:}O1gQPO'#EkO/|QPO,5;UO1rQQO'#ErO3YQPO'#FwOOQO'#Eq'#EqO!UQPO,5;WO4mQPO,5;[O5}QPO'#FcOOQO'#Ei'#EiOOQO,5;`,5;`O7gQPO,5;`OOQO1G.g1G.gOOQO1G.x1G.xO7{QPO1G.zO8SQWO'#FYO;cQWO'#F]O!vQQO'#DOO<tQSO'#DQOOQO'#F_'#F_OOQO,59h,59hO=OQSO,59hO=WQWO'#F[OOQO,5;|,5;|O?SQPO,5;|O?XQPO,5;|O?aQPO'#DTO?fQPO1G/QOOQO1G.}1G.}OOQO'#Df'#DfOOQO'#Dg'#DgOOQO'#Dh'#DhOOQO'#Di'#DiOOQO'#Dk'#DkOOQO'#Dl'#DlOOQO'#Dm'#DmO!vQQO,59|O!vQQO,59|O!vQQO,59|O!vQQO,59|O!vQQO,59|O!vQQO,59|O!vQQO,59|O!vQQO,59|O!vQQO,59|O?qQPO,5:sOA^QPO,5:YOBvQQO'#D]OOQO,5:_,5:_OCpQQO,5:`OCwQPO,5;lOOQO-E9O-E9OOOQO1G0t1G0tOOQO1G.m1G.mO&`QPO1G.pO!vQQO1G0aODRQPO1G0dO!vQQO,5;PO!UQPO'#FOOD`QPO,5<aO!vQQO,5;QO&`QPO1G0iO!UQPO'#FPODhQPO,5;VO!UQPO,5;VOOQO1G0p1G0pO!UQPO'#EsOOQO,5;^,5;^O!UQPO'#FRODsQPO,5<cO/|QPO1G0rO!vQQO1G0vO!vQQO'#ExOFWQPO,5;}OOQO1G0z1G0zOOQO7+$f7+$fOGnQQO,59kOHoQPO,59jOHvQQO1G/SOH}QSO1G/SOOQO1G/S1G/SOJvQSO,5:YOOQO1G1h1G1hOKQQPO1G1hO!vQQO,59oOOQO7+$l7+$lONOQPO1G/hONVQPO1G/hO!#VQPO1G/hO!#^QPO1G/hO!&WQPO1G/hO!&eQPO1G/hO!(uQPO1G/hO!,kQPO1G/hO!,rQPO1G/hO!,yQPO1G0_O!-OQPO'#FeO!-YQPO'#FeOOQO'#D^'#D^O!-bQPO,59wOOQO'#Dv'#DvOOQO'#E{'#E{O!-gQQO1G/zO!-nQQO'#DwOGnQQO'#DzO!.rQPO'#D|O!-nQQO'#D}O!.wQQO'#EPOGnQQO'#ERO!/xQPO'#ETOGnQQO'#EVOOQO1G/z1G/zO!/}QPO7+$[O!0SQPO7+%{O!1cQPO7+&OO!1nQPO1G0kOOQO,5;j,5;jOOQO-E8|-E8|OOQO1G0l1G0lO!1uQPO7+&TOOQO,5;k,5;kOOQO-E8}-E8}O!UQPO1G0qOOQO1G0q1G0qO!1zQQO,5;_OOQO,5;m,5;mOOQO-E9P-E9POOQO7+&^7+&^OOQO7+&b7+&bO!2PQPO,5;dOOQO-E8v-E8vO!3iQSO1G/VO!3sQPO1G/UO!5lQSO1G/hO!5sQSO1G/hO!7nQSO1G/hO!7uQSO1G/hO!9jQSO1G/hO!9wQSO1G/hO!;uQSO1G/hO!=sQSO1G/hO!=zQSO1G/hOOQO,5;c,5;cOOQO7+$n7+$nO!>RQQO7+$nOOQO-E8u-E8uOOQO7+'S7+'SO!>YQPO'#DWO!>pQPO'#FdOOQO1G/Z1G/ZO!vQQO7+%yO!>xQQO'#EyO!?TQPO,5<PO&`QPO1G/cOOQO-E8y-E8yOOQO7+%f7+%fO!?]Q`O'#FYO!A_Q`O'#F]O!CYQ`O'#DQO!C|Q`O'#F[O!FRQQO'#DyOOQO,5:c,5:cO!FsQSO,5:fO!.wQQO,5:hOOQO,5:i,5:iO!GdQ`O,5:kO!HWQSO,5:mO!-nQQO,5:oO!HwQSO,5:qOOQO<<Gv<<GvO!IhQPO<<IjO!vQQO'#E}OOQO<<Ij<<IjO&`QPO<<IjO!vQQO7+&VOOQO<<Io<<IoOOQO7+&]7+&]OOQO1G0y1G0yOGnQQO7+$pOOQO<<HY<<HYP'cQQO'#EwO!IsQPO,59rO!I{QPO,59rO!JWQPO,59rO!vQQO'#EzO!J`QPO,5<OO!JhQPO<<IeO!JoQPO,5;eOOQO,5;e,5;eOOQO-E8w-E8wO!JyQPO7+$}O!KOQ`O,5:YO!-nQQO'#E|O!KcQQO,5:eO!LTQ`O'#DWO!MTQQO'#FdOOQO1G0S1G0SOGnQQO1G0VOOQO1G0Z1G0ZOOQO-E8{-E8{OOQOAN?UAN?UO&`QPOAN?UO!MuQPO,5;iO!M|QPOAN?UO!NRQPO<<IqO!N]QSO<<H[OOQO1G/^1G/^O!NgQPO1G/^O!NoQPO1G/^O/|QPO1G/^OOQO,5;f,5;fOOQO-E8x-E8xOOQOAN?PAN?POOQO<<Hi<<HiO!NzQ`O1G/VO##kQ`O1G/hO##rQ`O1G/hO#%vQ`O1G/hO#%}Q`O1G/hO#'{Q`O1G/hO#(YQ`O1G/hO#(gQ`O1G/hO#*wQ`O1G/hO#+OQ`O1G/hOOQO,5;h,5;hOOQO-E8z-E8zO#+VQQO,59rO#+zQQO,5<OO#,lQSO7+%qO#-]QPOG24pODRQPO1G1TOOQOG24pG24pO!vQQOAN?]OOQO7+$x7+$xO#-bQPO7+$xO#-jQPO7+$xO#-uQQO1G/^OOQOLD*[LD*[OOQO7+&o7+&oO#.jQPOG24wOOQO<<Hd<<HdO#.qQPO<<HdO#.yQ`O<<H[O#/mQQO7+$xOOQOAN>OAN>OOGnQQO'#DnO!.wQQO'#DnOGnQQO,59|O!.wQQO,59|OGnQQO,59|O!.wQQO,59|OGnQQO,59|O!.wQQO,59|OGnQQO,59|O!.wQQO,59|OGnQQO,59|O!.wQQO,59|OGnQQO,59|O!.wQQO,59|OGnQQO,59|O!.wQQO,59|OGnQQO,59|O!.wQQO,59|OGnQQO,59|O!.wQQO,59|O!.wQQO,59kO!.wQQO7+$pO#0bQPO,59rO!.wQQO'#EzO/|QPO1G/^O#0jQPO1G/UO#0oQPO,59jO!vQQO'#DO",
stateData: "#0y~O#xOS#yOSPOS~OSZOUQOWZOY`O[aO_bOlTO!OfO#OcO#RdO#WeO#agO#ihO#{PO~O#vRP~P]OgkOilOlnOoqOqmO#}jO~O`yOayObyOcyOdyOlTOqmO!OzO!cxO!i{O#{PO#}jO$[vO$`uO$fwO~Og$OXi$OXl$OXo$OXq$OX#}$OX~Ov|O$S$jX~P#wOS#zXU#zXW#zXY#zX[#zX_#zXl#zX!O#zX#O#zX#R#zX#W#zX#a#zX#i#zX#v#zX#{#zX]#zX#P#zX#T#zX#U#zX~P#wO$S!OO~O#vRX]RX#PRX#TRX#URX~P]O]RP~P]O#PRP~P]O!O!aO#{PO~OS!eO#v#hX]#hX#P#hX#T#hX#U#hX~P!vOU!gO~O`yOayObyOcyOdyOi!lOlTOqmO!OzO!c'jO!i{O#{PO#}jO$[vO$`uO$fwO~Ou!oO~P'cOm!rOx!uO~P!vOm#|X!V#|X!W#|X!X#|X!^#|X$Y#|X$Z#|X$[#|X$]#|X$^#|X$_#|X$`#|X$a#|X$b#|X$c#|X$d#|X$e#|X[#|X#S#|XS#|Xv#|X#v#|Xj#|Xx#|XU#|XW#|XY#|X_#|X!O#|X#O#|X#R#|X#W#|X#a#|X#i#|X#{#|X]#|X#P#|X{#|X|#|X}#|X!R#|X#T#|X#U#|X~P!bO!V#WO!W#XO!X#PO!^#TO$Y!xO$Z!yO$[!zO$]!{O$^!{O$_!|O$`!|O$a!}O$b!}O$c!}O$d!}O$e#OO~Om!wO~P+sO!|#YOm$OX!V$OX!W$OX!X$OX!^$OX$Y$OX$Z$OX$[$OX$]$OX$^$OX$_$OX$`$OX$a$OX$b$OX$c$OX$d$OX$e$OX[$OX#S$OXS$OXv$OX#v$OXj$OXx$OXU$OXW$OXY$OX_$OX!O$OX#O$OX#R$OX#W$OX#a$OX#i$OX#{$OX]$OX#P$OX{$OX|$OX}$OX!R$OX#T$OX#U$OX~P#wOl#[O~O$g#^O~OlTO#{PO~Ov|O$S$ja~O]#bO~O[#cO~P+sO#P#dO~O#S#eO~P+sOv#gO$S#fO#[$iX~O#[#iO~O[#jO~Og#kOo#mOl#_X~O$l#oOS#gPU#gPW#gPY#gP[#gP_#gPl#gPv#gP!O#gP#O#gP#R#gP#W#gP#a#gP#i#gP#v#gP#{#gP$S#gP]#gP#P#gP#T#gP#U#gP~Ov#qOS$kXU$kXW$kXY$kX[$kX_$kXl$kX!O$kX#O$kX#R$kX#W$kX#a$kX#i$kX#v$kX#{$kX$S$kX]$kX#P$kX#T$kX#U$kX~O$S#tOS#daU#daW#daY#da[#da_#dal#da!O#da#O#da#R#da#W#da#a#da#i#da#v#da#{#da]#da#P#da#T#da#U#da~Ov#uOS$VX#v$VXm$VXx$VXU$VXW$VXY$VX[$VX_$VXl$VX!O$VX#O$VX#R$VX#W$VX#a$VX#i$VX#{$VX]$VX#P$VX#T$VX#U$VX~P+sOS#wO#v#ha]#ha#P#ha#T#ha#U#ha~Oj#xO~P+sOu#|X!V#|X!W#|X!X#|X!^#|X$T#|X$Y#|X$Z#|X$[#|X$]#|X$^#|X$_#|X$`#|X$a#|X$b#|X$c#|X$d#|X$e#|Xx#|X!l#|X!o#|X!r#|X!t#|X!v#|X!x#|X!z#|X$h#|X~P!bOg$PXi$PXl$PXo$PXq$PX!V$PX!W$PX!X$PX!^$PX#}$PX$Y$PX$Z$PX$[$PX$]$PX$^$PX$_$PX$`$PX$a$PX$b$PX$c$PX$d$PX$e$PX~O$S#yOu$PX$T$PX~P9{O!V'zO!W'|O!X'lO!^'tO$Y!xO$Z!yO$[!zO$]!{O$^!{O$_!|O$`!|O$a!}O$b!}O$c!}O$d!}O$e#OO~OutX$TtX~P;pOu#}O$T#{O~O!|#YOu$OX!V$OX!W$OX!X$OX!^$OX$T$OX$Y$OX$Z$OX$[$OX$]$OX$^$OX$_$OX$`$OX$a$OX$b$OX$c$OX$d$OX$e$OXx$OX!l$OX!o$OX!r$OX!t$OX!v$OX!x$OX!z$OX$h$OX~P#wOm$PO~Om$POx!uO~Oy$RO~OlnOqmO#}jO~Ol$^O~O$e#OO!V!ba!W!ba!X!ba!^!ba$Y!ba$Z!ba$[!ba$]!ba$^!ba$_!ba$`!ba$a!ba$b!ba$c!ba$d!bav!bax!ba{!ba|!ba}!ba!R!ba~Om!ba[!ba#S!baS!ba#v!baj!baU!baW!baY!ba_!bal!ba!O!ba#O!ba#R!ba#W!ba#a!ba#i!ba#{!ba]!ba#P!ba#T!ba#U!ba~P?vOc$`OlTO#{POm!QP~Ox$hO!l$fO!o$gO!r$iO!t$jO!v$kO!x$lO!z$mO~O$h$nO~PCUOv#ta$S#ta~P#wO]RP#TRP#URP~P]Ov#gO#[$ia~Og#kOo$yOl#_a~Ov#qOS$kaU$kaW$kaY$ka[$ka_$kal$ka!O$ka#O$ka#R$ka#W$ka#a$ka#i$ka#v$ka#{$ka$S$ka]$ka#P$ka#T$ka#U$ka~Ov#uOS$Va#v$Vam$Vax$VaU$VaW$VaY$Va[$Va_$Val$Va!O$Va#O$Va#R$Va#W$Va#a$Va#i$Va#{$Va]$Va#P$Va#T$Va#U$Va~O`yOayObyOcyOdyOlTOqmO!OzO!c'jO!i{O#{PO#}jO$[vO$`uO$fwO~Oj%TO~P+sOu%`O~P'cOu%`O$T%aO~O$e#OO!V!ba!W!ba!X!ba!^!ba$Y!ba$Z!ba$[!ba$]!ba$^!ba$_!ba$`!ba$a!ba$b!ba$c!ba$d!bax!ba!l!ba!o!ba!r!ba!t!ba!v!ba!x!ba!z!ba$h!ba~Ou!ba$T!ba~PIVOm%cO~O!^#TO$Z!yO$[!zO$]!{O$^!{O$_!|O$`!|O$a!}O$b!}O$c!}O$d!}O$e#OOm!Ui!V!Ui!W!Ui!X!Ui[!Ui#S!UiS!Uiv!Ui#v!Uij!Uix!UiU!UiW!UiY!Ui_!Uil!Ui!O!Ui#O!Ui#R!Ui#W!Ui#a!Ui#i!Ui#{!Ui]!Ui#P!Ui{!Ui|!Ui}!Ui!R!Ui#T!Ui#U!Ui~O$Y!xO~PKVO$Y!Ui~PKVO!^#TO$]!{O$^!{O$_!|O$`!|O$a!}O$b!}O$c!}O$d!}O$e#OOm!Ui!V!Ui!W!Ui!X!Ui$Y!Ui$[!Ui[!Ui#S!UiS!Uiv!Ui#v!Uij!Uix!UiU!UiW!UiY!Ui_!Uil!Ui!O!Ui#O!Ui#R!Ui#W!Ui#a!Ui#i!Ui#{!Ui]!Ui#P!Ui{!Ui|!Ui}!Ui!R!Ui#T!Ui#U!Ui~O$Z!Ui~PN^O$Z!yO~PN^O$a!}O$b!}O$c!}O$d!}O$e#OOm!Ui!V!Ui!W!Ui!X!Ui$Y!Ui$Z!Ui$[!Ui$]!Ui$^!Ui[!Ui#S!UiS!Uiv!Ui#v!Uij!Uix!UiU!UiW!UiY!Ui_!Uil!Ui!O!Ui#O!Ui#R!Ui#W!Ui#a!Ui#i!Ui#{!Ui]!Ui#P!Ui{!Ui|!Ui}!Ui!R!Ui#T!Ui#U!Ui~O!^#TO$_!|O$`!|O~P!#eO!^!Ui$_!Ui$`!Ui~P!#eO$e#OOm!Ui!V!Ui!W!Ui[!Ui#S!UiS!Uiv!Ui#v!Uij!Uix!UiU!UiW!UiY!Ui_!Uil!Ui!O!Ui#O!Ui#R!Ui#W!Ui#a!Ui#i!Ui#{!Ui]!Ui#P!Ui{!Ui|!Ui}!Ui!R!Ui#T!Ui#U!Ui~O!X!Ui!^!Ui$Y!Ui$Z!Ui$[!Ui$]!Ui$^!Ui$_!Ui$`!Ui$a!Ui$b!Ui$c!Ui$d!Ui~P!&rO!X#PO!^#TO$Y!xO$Z!yO$[!zO$]!{O$^!{O$_!|O$`!|O$a!}O$b!}O$c!}O$d!}O$e#OOm!Ui!V!Ui[!Ui#S!UiS!Uiv!Ui#v!Uij!Uix!UiU!UiW!UiY!Ui_!Uil!Ui!O!Ui#O!Ui#R!Ui#W!Ui#a!Ui#i!Ui#{!Ui]!Ui#P!Ui{!Ui|!Ui}!Ui!R!Ui#T!Ui#U!Ui~O!W#XO~P!)rO!W!Ui~P!)rO!o%gO~Ov%hOm$XX~P#wOv%hOm$XX~Om%jO~O$h%lO~PCUO`yOayObyOcyOdyOi(VOlTOqmO!OzO!c'kO!i{O#{PO#}jO$[vO$`uO$fwO~Oy%tO~O`yOayObyOcyOdyOlTOqmO!OzO!c'kO!i{O#{PO#}jO$[vO$`uO$fwO~Oy%xO~O]%zO~OS!}qU!}qW!}qY!}q[!}q_!}ql!}q!O!}q#O!}q#R!}q#W!}q#a!}q#i!}q#v!}q#{!}q]!}q#P!}q#T!}q#U!}q~P+sO]%}O#T%|O#U&OO~Ov&PO~P+sO]&QO~O$m&SO~OS#lav#la#v#lam#lax#laU#laW#laY#la[#la_#lal#la!O#la#O#la#R#la#W#la#a#la#i#la#{#la]#la#P#la#T#la#U#la~P+sOusi$Tsi~P;pO$S&TO~O!^'tO$Z!yO$[!zO$]!{O$^!{O$_!|O$`!|O$a!}O$b!}O$c!}O$d!}O$e#OOu!Ui!V!Ui!W!Ui!X!Ui$T!Uix!Ui!l!Ui!o!Ui!r!Ui!t!Ui!v!Ui!x!Ui!z!Ui$h!Ui~O$Y!xO~P!3xO$Y!Ui~P!3xO!^'tO$]!{O$^!{O$_!|O$`!|O$a!}O$b!}O$c!}O$d!}O$e#OOu!Ui!V!Ui!W!Ui!X!Ui$T!Ui$Y!Ui$[!Uix!Ui!l!Ui!o!Ui!r!Ui!t!Ui!v!Ui!x!Ui!z!Ui$h!Ui~O$Z!Ui~P!5zO$Z!yO~P!5zO$a!}O$b!}O$c!}O$d!}O$e#OOu!Ui!V!Ui!W!Ui!X!Ui$T!Ui$Y!Ui$Z!Ui$[!Ui$]!Ui$^!Uix!Ui!l!Ui!o!Ui!r!Ui!t!Ui!v!Ui!x!Ui!z!Ui$h!Ui~O!^'tO$_!|O$`!|O~P!7|O!^!Ui$_!Ui$`!Ui~P!7|O$e#OO!V!Ui!W!Ui!X!Ui!^!Ui$Y!Ui$Z!Ui$[!Ui$]!Ui$^!Ui$_!Ui$`!Ui$a!Ui$b!Ui$c!Ui$d!Uix!Ui!l!Ui!o!Ui!r!Ui!t!Ui!v!Ui!x!Ui!z!Ui$h!Ui~Ou!Ui$T!Ui~P!:UO!X'lO!^'tO$Y!xO$Z!yO$[!zO$]!{O$^!{O$_!|O$`!|O$a!}O$b!}O$c!}O$d!}O$e#OOu!Ui!V!Ui$T!Uix!Ui!l!Ui!o!Ui!r!Ui!t!Ui!v!Ui!x!Ui!z!Ui$h!Ui~O!W'|O~P!<PO!W!Ui~P!<POu&UO~P'cO{&XO|&XO}&YO!R&WOmzXvzX~P+sOv&ZOm$WX~Oc&_OlTO#{PO~Ov%hOm$Xa~Ov#|Xx#|X!V#|X!W#|X!X#|X!^#|X!l#|X!o#|X!r#|X!t#|X!v#|X!x#|X!z#|X$Y#|X$Z#|X$[#|X$]#|X$^#|X$_#|X$`#|X$a#|X$b#|X$c#|X$d#|X$e#|X$h#|X{#|X|#|X}#|X!R#|X~P!bO$S(OOv$PXx$PX!l$PX!o$PX!r$PX!t$PX!v$PX!x$PX!z$PX$h$PX~P9{O!V'{O!W'}O!X'mO!^'uO$Y!xO$Z!yO$[!zO$]!{O$^!{O$_!|O$`!|O$a!}O$b!}O$c!}O$d!}O$e#OO~OvtXxtX!ltX!otX!rtX!ttX!vtX!xtX!ztX$htX~P!BUO!|#YOv$OXx$OX!V$OX!W$OX!X$OX!^$OX!l$OX!o$OX!r$OX!t$OX!v$OX!x$OX!z$OX$Y$OX$Z$OX$[$OX$]$OX$^$OX$_$OX$`$OX$a$OX$b$OX$c$OX$d$OX$e$OX$h$OX{$OX|$OX}$OX!R$OX~P#wOv&cOx!mX!l!mX!o!mX!r!mX!t!mX!v!mX!x!mX!z!mX$h!mX~Ox!na!l!na!o!na!r!na!t!na!v!na!x!na!z!na$h!na~P;pOv&hOx!sa!l!sa!o!sa!r!sa!t!sa!v!sa!x!sa!z!sa$h!sa~P!BUOx!ua!l!ua!o!ua!r!ua!t!ua!v!ua!x!ua!z!ua$h!ua~P;pOx!ya!l!ya!o!ya!r!ya!t!ya!v!ya!x!ya!z!ya$h!ya~P;pO]&kO#T%|O#U&lO~O!S&qO!T&qO~O!R&rOmzavza~O!O&tO#{PO~Ov&ZOm$Wa~Om&wO~P+sOm#mav#ma~P#wO]&xO~Ov!ba{!ba|!ba}!ba!R!ba~PIVOv&cOx!ma!l!ma!o!ma!r!ma!t!ma!v!ma!x!ma!z!ma$h!ma~O{'VO|'VO}(QO!R&WOvzXxzX!lzX!ozX!rzX!tzX!vzX!xzX!zzX$hzX~P!BUOv(ROx$WX!l$WX!o$WX!r$WX!t$WX!v$WX!x$WX!z$WX$h$WX~O#S'ZO~P+sO]'[O~Ov']O[#Xy~P+sOury$Try~P;pO!S'^O!T'^O~O!R'_Omzivzi~Ovsixsi!lsi!osi!rsi!tsi!vsi!xsi!zsi$hsi~P!BUO!^'uO$Z!yO$[!zO$]!{O$^!{O$_!|O$`!|O$a!}O$b!}O$c!}O$d!}O$e#OOv!Uix!Ui!V!Ui!W!Ui!X!Ui!l!Ui!o!Ui!r!Ui!t!Ui!v!Ui!x!Ui!z!Ui$h!Ui{!Ui|!Ui}!Ui!R!Ui~O$Y!xO~P# nO$Y!Ui~P# nO!^'uO$]!{O$^!{O$_!|O$`!|O$a!}O$b!}O$c!}O$d!}O$e#OOv!Uix!Ui!V!Ui!W!Ui!X!Ui!l!Ui!o!Ui!r!Ui!t!Ui!v!Ui!x!Ui!z!Ui$Y!Ui$[!Ui$h!Ui{!Ui|!Ui}!Ui!R!Ui~O$Z!Ui~P##yO$Z!yO~P##yO$a!}O$b!}O$c!}O$d!}O$e#OOv!Uix!Ui!V!Ui!W!Ui!X!Ui!l!Ui!o!Ui!r!Ui!t!Ui!v!Ui!x!Ui!z!Ui$Y!Ui$Z!Ui$[!Ui$]!Ui$^!Ui$h!Ui{!Ui|!Ui}!Ui!R!Ui~O!^'uO$_!|O$`!|O~P#&UO!^!Ui$_!Ui$`!Ui~P#&UOv!Ui{!Ui|!Ui}!Ui!R!Ui~P!:UO!X'mO!^'uO$Y!xO$Z!yO$[!zO$]!{O$^!{O$_!|O$`!|O$a!}O$b!}O$c!}O$d!}O$e#OOv!Uix!Ui!V!Ui!l!Ui!o!Ui!r!Ui!t!Ui!v!Ui!x!Ui!z!Ui$h!Ui{!Ui|!Ui}!Ui!R!Ui~O!W'}O~P#(zO!W!Ui~P#(zO!R&rOvzaxza!lza!oza!rza!tza!vza!xza!zza$hza~Ov(ROx$Wa!l$Wa!o$Wa!r$Wa!t$Wa!v$Wa!x$Wa!z$Wa$h$Wa~Ox!sq!l!sq!o!sq!r!sq!t!sq!v!sq!x!sq!z!sq$h!sq~P;pO]'bO~O!S'eO!T'eO~O!R'fOmzqvzq~O!R'_Ovzixzi!lzi!ozi!rzi!tzi!vzi!xzi!zzi$hzi~O[#X!Z~P+sO!S'iO!T'iO~Ovryxry!lry!ory!rry!try!vry!xry!zry$hry~P!BUO!R'fOvzqxzq!lzq!ozq!rzq!tzq!vzq!xzq!zzq$hzq~O!O(SO#{PO~O$S(PO~Oj(TO~P+sOP$`~",
goto: "Gn$lPPP$mP%]P%jP%]P%]PP%]PPPPPP(g*XP*XPP,QPP-yP(gP/z/z/zPP0UPP0[PPPP0f0uPPP(nPPP0x1t2v3uP4z6S7_(nP8p8p8p(n(nP:_:cP:g:cP:c:cP:cP:cP:cP:cP(nP%]PP%]PPPP%]P:p:p:sP:v%];S%]P%];V%];d;g;m;pP<P<`<f<l<s<}=T=Z=a=g=m=sPPPP=yP>WPBVDUFVF`PPFpFwGQGWPPPPPPPPPPPPPPPGZG^GkQ_OQ!SaQ!UcQ$o#cQ$q#eQ$v#jQ&a%jQ&n&OQ'Y&lR'c'ZgZO]ac#c#e#j%j&O&l'Z$[SOT]abcdhlnx|!O!l#P#Q#R#S#T#U#V#W#X#[#c#d#e#f#i#j#t#u#y$R$g$j$k$m%g%h%j%t%|&O&P&T&Z&h&l'Z']'j'k'l'm'n'o'p'q'r's't'u'v'w'x'y'z'{'|'}(O(P(R(VQiQQ!R`Q!WeQ![fS!^g#qQ!hkW!km#{%a&VQ!vqQ#s!aQ$s#gQ$w#kQ$z#mQ${#oW%n$f$i%x&cQ&R$yQ&s&YR'a(QYoRr!j!v%m$PyTbdhlmnx!O!l#P#Q#R#S#T#U#V#W#X#d#f#i#t#u#y#{$R$f$g$i$j$k$m%a%g%t%x%|&P&T&V&Z&c&h']'j'k'l'm'n'o'p'q'r's't'u'v'w'x'y'z'{'|'}(O(P(R(V$mSOT]abcdhlmnx|!O!l#P#Q#R#S#T#U#V#W#X#[#c#d#e#f#i#j#t#u#y#{$R$f$g$i$j$k$m%a%g%h%j%t%x%|&O&P&T&V&Z&c&h&l'Z']'j'k'l'm'n'o'p'q'r's't'u'v'w'x'y'z'{'|'}(O(P(R(V$mVOT]abcdhlmnx|!O!l#P#Q#R#S#T#U#V#W#X#[#c#d#e#f#i#j#t#u#y#{$R$f$g$i$j$k$m%a%g%h%j%t%x%|&O&P&T&V&Z&c&h&l'Z']'j'k'l'm'n'o'p'q'r's't'u'v'w'x'y'z'{'|'}(O(P(R(VUV|#[%hfWO]ac#c#e#j%j&O&l'Z!^tTbdhlnx!O!l#P#Q#R#S#T#U#V#W#X#d#f#i#t#u$R%g%|&P&Z'](Vx!qm#y#{$g$k$m%a&T&V&h'j'l'n'p'r't'v'x'z'|w%p$f$i$j%t%x&c'k'm'o'q's'u'w'y'{'}(O(P(Ra!nm#{$f$i%a%x&V&cQ!snR$Q!tQ%e$RQ&f%tT&u&Z(RQ#]zQ#n!]Q%O#sQ'`&tR'h(SR$b#[t#Qs!T!V!c!i#z$T$[$]$p$r%Q%d&]&m&o'd(Ud'n!m%S%U%]%^%s%w%y&p'Xa'o%o%v&e&y&z'R'S'gx#Rs!T!V!c!i#z$T$U$W$[$]$p$r%Q%d&]&m&o'd(Uh'p!m%S%U%V%X%]%^%s%w%y&p'Xe'q%o%v&e&y&z&{&}'R'S'gv#Ss!T!V!c!i#z$T$U$[$]$p$r%Q%d&]&m&o'd(Uf'r!m%S%U%V%]%^%s%w%y&p'Xc's%o%v&e&y&z&{'R'S'gz#Ts!T!V!c!i#z$T$U$V$W$[$]$p$r%Q%d&]&m&o'd(Uj't!m%S%U%V%W%X%]%^%s%w%y&p'Xg'u%o%v&e&y&z&{&|&}'R'S'g|#Us!T!V!c!i#z$T$U$V$W$X$[$]$p$r%Q%d&]&m&o'd(Ul'v!m%S%U%V%W%X%Y%]%^%s%w%y&p'Xi'w%o%v&e&y&z&{&|&}'O'R'S'g!O#Vs!T!V!c!i#z$T$U$V$W$X$Y$[$]$p$r%Q%d&]&m&o'd(Un'x!m%S%U%V%W%X%Y%Z%]%^%s%w%y&p'Xk'y%o%v&e&y&z&{&|&}'O'P'R'S'g!S#Vs!T!V!c!i#Z#z$T$U$V$W$X$Y$Z$[$]$p$r%Q%d&]&m&o'd(Ur'x!m$O%S%U%V%W%X%Y%Z%[%]%^%s%w%y&p'Xo'y%o%v&b&e&y&z&{&|&}'O'P'Q'R'S'g!^xTbdhlnx!O!l#P#Q#R#S#T#U#V#W#X#d#f#i#t#u$R%g%|&P&Z'](Vx'jm#y#{$g$k$m%a&T&V&h'j'l'n'p'r't'v'x'z'|w'k$f$i$j%t%x&c'k'm'o'q's'u'w'y'{'}(O(P(RT$d#^$eT$c#^$eQ%r$fQ%u$iR&i%xR!ZeR!YeQ!fhQ#a!OQ$u#iR%P#tR!]fgYO]ac#c#e#j%j&O&l'ZR!bgQ!_gR$|#qR#p!^d^Oac#c#e#j%j&O&l'ZR!Q]d]Oac#c#e#j%j&O&l'ZR!P]Q#|!pR%b#|Q#v!cR%R#vS%i$_$`R&`%iQ&[%eS&v&['WR'W&fQ$e#^R%k$eQ&d%qR'U&dQ%{$qR&j%{Q#h!WR$t#hQ#l![R$x#lQ}UR#`}Q#r!_R$}#rg[O]ac#c#e#j%j&O&l'ZQsTQ!TbQ!VdY!chn!O#i#tQ!ilW!mm#{%a&VQ#ZxQ#z!lQ$O'jQ$T#PQ$U#QQ$V#RQ$W#SQ$X#TQ$Y#UQ$Z#VQ$[#WQ$]#XQ$p#dQ$r#fQ%Q#uQ%S#yQ%U'lQ%V'nQ%W'pQ%X'rQ%Y'tQ%Z'vQ%['xQ%]'zQ%^'|S%d$R&ZW%o$f$i%x&cQ%s$gQ%v$jQ%w$kQ%y$mQ&]%gQ&b'kS&e%t(RQ&m%|Q&o&PQ&p&TQ&y(OQ&z'mQ&{'oQ&|'qQ&}'sQ'O'uQ'P'wQ'Q'yQ'R'{Q'S'}Q'X&hQ'd']Q'g(PR(U(VlRO]ac|#[#c#e#j%h%j&O&l'Z!^rTbdhlnx!O!l#P#Q#R#S#T#U#V#W#X#d#f#i#t#u$R%g%|&P&Z'](Vx!jm#y#{$g$k$m%a&T&V&h'j'l'n'p'r't'v'x'z'|w%m$f$i$j%t%x&c'k'm'o'q's'u'w'y'{'}(O(P(RfUO]ac#c#e#j%j&O&l'Z$OVTbdhlmnx!O!l#P#Q#R#S#T#U#V#W#X#d#f#i#t#u#y#{$R$f$g$i$j$k$m%a%g%t%x%|&P&T&V&Z&c&h']'j'k'l'm'n'o'p'q'r's't'u'v'w'x'y'z'{'|'}(O(P(R(VQ#_|Q$_#[R&^%hWpRr!j%mR$S!vQ!pmU%_#{%a&VU%q$f$i%xR'T&cZoRr!j!v%mW!dh!O#i#tR!tnQ%f$RR&g%tR$a#[R!XegXO]ac#c#e#j%j&O&l'ZR!`g",
nodeNames: "⚠ Comment Chunk Block ; Label :: Name break Goto goto Scope do end WhileStatement while nil true false Ellipsis Number LiteralString Property . MemberExpression [ ] Parens ( ) FunctionCall : TableConstructor { FieldDynamic FieldProp FieldExp } , AggOrderBy order by OrderBy desc asc using function FuncBody ArgList nulls first last BinaryExpression or and CompareOp BitOp BitOp BitOp BitOp Concat ArithOp ArithOp ArithOp UnaryExpression not ArithOp BitOp LenOp FunctionDef Query query QueryClause FromClause from FieldList WhereClause where OrderByClause SelectClause select LimitClause limit OffsetClause offset GroupByClause group HavingClause having FilteredCall filter RepeatStatement repeat until IfStatement if then elseif else ForStatement for ForNumeric ForGeneric NameList in ExpList Function FuncName LocalFunction local Assign VarList Local AttNameList AttName Attrib ReturnStatement return",
maxTerm: 167,
nodeProps: [
["group", -14,4,5,8,9,11,14,30,91,94,99,106,108,110,112,"Statement",-3,34,35,36,"Field"]
],
skippedNodes: [0,1],
repeatNodeCount: 12,
tokenData: "Dj~RuXY#fYZ$Q[]#f]^$_pq#fqr$grs$rst)`uv)evw)jwx)oxy.Wyz.]z{.b{|.g|}.l}!O.s!O!P/g!P!Q/|!Q!R0^!R![1u![!]3m!]!^3z!^!_4R!_!`4e!`!a4m!c!}5P!}#O5b#O#P#w#P#QCo#Q#RC|#R#S5P#T#o5P#o#pDR#p#qDW#q#rD]#r#sDb~#kS#y~XY#f[]#fpq#f#O#P#w~#zQYZ#f]^#f~$VP#x~]^$Y~$_O#x~~$dP#x~YZ$Ym$jP!_!`$mm$rO!Xmk$uXOY$rZ]$r^r$rrs%bs#O$r#O#P%g#P;'S$r;'S;=`'}<%lO$rk%gO#}kk%j]rs$rwx$r!Q![&c#O#P$r#T#U$r#U#V$r#Y#Z$r#b#c$r#f#g$r#h#i$r#i#j(T#l#m(v#n#o$rk&fZOY$rZ]$r^r$rrs%bs!Q$r!Q!['X![#O$r#O#P%g#P;'S$r;'S;=`'}<%lO$rk'[ZOY$rZ]$r^r$rrs%bs!Q$r!Q![$r![#O$r#O#P%g#P;'S$r;'S;=`'}<%lO$rk(QP;=`<%l$rk(WP#o#p(Zk(^R!Q![(g!c!i(g#T#Z(gk(jS!Q![(g!c!i(g#T#Z(g#q#r$rk(yR!Q![)S!c!i)S#T#Z)Sk)VR!Q![$r!c!i$r#T#Z$r~)eO$f~~)jO$c~~)oO$Z~k)rXOY)oZ])o^w)owx%bx#O)o#O#P*_#P;'S)o;'S;=`,u<%lO)ok*b]rs)owx)o!Q![+Z#O#P)o#T#U)o#U#V)o#Y#Z)o#b#c)o#f#g)o#h#i)o#i#j,{#l#m-n#n#o)ok+^ZOY)oZ])o^w)owx%bx!Q)o!Q![,P![#O)o#O#P*_#P;'S)o;'S;=`,u<%lO)ok,SZOY)oZ])o^w)owx%bx!Q)o!Q![)o![#O)o#O#P*_#P;'S)o;'S;=`,u<%lO)ok,xP;=`<%l)ok-OP#o#p-Rk-UR!Q![-_!c!i-_#T#Z-_k-bS!Q![-_!c!i-_#T#Z-_#q#r)ok-qR!Q![-z!c!i-z#T#Z-zk-}R!Q![)o!c!i)o#T#Z)o~.]Ol~~.bOm~~.gO$a~~.lO$_~o.sOvc$T[~.xP$`~}!O.{~/QTP~OY.{Z].{^;'S.{;'S;=`/a<%lO.{~/dP;=`<%l.{o/lPgi!O!P/oo/tP!^m!O!P/wQ/|OcQ~0RQ$b~!P!Q0X!_!`$m~0^O$d~~0cUd~!O!P0u!Q![1u!g!h1Z!z!{2W#X#Y1Z#l#m2W~0xP!Q![0{~1QRd~!Q![0{!g!h1Z#X#Y1Z~1^R{|1g}!O1g!Q![1m~1jP!Q![1m~1rPd~!Q![1m~1zSd~!O!P0u!Q![1u!g!h1Z#X#Y1Z~2ZR!Q![2d!c!i2d#T#Z2d~2iUd~!O!P2{!Q![2d!c!i2d!r!s1Z#T#Z2d#d#e1Z~3OR!Q![3X!c!i3X#T#Z3X~3^Td~!Q![3X!c!i3X!r!s1Z#T#Z3X#d#e1Z~3rPo~![!]3u~3zOU~_4ROSR$T[o4YQ$lQ!Xm!^!_4`!_!`$mm4eO$]m~4jP$S~!_!`$mo4tQ$mQ!Xm!_!`$m!`!a4zm5PO$^m~5US#{~!Q![5P!c!}5P#R#S5P#T#o5Po5gQik!_!`5m!}#OB_k5pQ!_!`5v!}#O=ok5yP!}#O5|k6PTO#P5|#P#Q6`#Q;'S5|;'S;=`8W<%lO5|k6cVO!_6x!_!`:s!`#P6x#P#Q;w#Q;'S6x;'S;=`=i<%lO6xk6{VO!_7b!_!`8^!`#P7b#P#Q8v#Q;'S7b;'S;=`=c<%lO7bk7eTO#P5|#P#Q7t#Q;'S5|;'S;=`8W<%lO5|k7wP!_!`7zk7}P!_!`8Qk8TP#P#Q%bk8ZP;=`<%l5|k8aTO#P8^#P#Q7t#Q;'S8^;'S;=`8p<%lO8^k8sP;=`<%l8^k8yUO!_5|!_!`9]!`#P5|#Q;'S5|;'S;=`8W<%lO5|k9`VO!_5|!_!`9u!`#P5|#P#Q6`#Q;'S5|;'S;=`8W<%lO5|k9xTO#P5|#P#Q:X#Q;'S5|;'S;=`8W<%lO5|k:^V#}kO!_6x!_!`:s!`#P6x#P#Q;w#Q;'S6x;'S;=`=i<%lO6xk:vVO!_8^!_!`;]!`#P8^#P#Q7t#Q;'S8^;'S;=`8p<%lO8^k;`TO#P8^#P#Q;o#Q;'S8^;'S;=`8p<%lO8^k;tP#}k!_!`7zk;zVO!_7b!_!`:s!`#P7b#P#Q<a#Q;'S7b;'S;=`=c<%lO7bk<dVO!_5|!_!`9]!`#P5|#P#Q<y#Q;'S5|;'S;=`8W<%lO5|k<|VO!_8^!_!`:s!`#P8^#P#Q<y#Q;'S8^;'S;=`8p<%lO8^k=fP;=`<%l7bk=lP;=`<%l6xk=rTO#P=o#P#Q>R#Q;'S=o;'S;=`>}<%lO=ok>UVO!_>k!_!`?T!`#P>k#P#Q@X#Q;'S>k;'S;=`Ao<%lO>kk>nTO#P=o#P#Q7z#Q;'S=o;'S;=`>}<%lO=ok?QP;=`<%l=ok?WTO#P?g#P#Q@P#Q;'S?g;'S;=`?y<%lO?gk?jTO#P?g#P#Q7z#Q;'S?g;'S;=`?y<%lO?gk?|P;=`<%l?gk@UP#}k!_!`8Qk@[VO!_=o!_!`@q!`#P=o#P#QAu#Q;'S=o;'S;=`>}<%lO=ok@tTO#P=o#P#QAT#Q;'S=o;'S;=`>}<%lO=okAYV#}kO!_>k!_!`?T!`#P>k#P#Q@X#Q;'S>k;'S;=`Ao<%lO>kkArP;=`<%l>kkAxVO!_?g!_!`?T!`#P?g#P#QAu#Q;'S?g;'S;=`?y<%lO?goBdT$gSO#PBs#P#QCV#Q;'SBs;'S;=`Ci<%lOBskBvTO#PBs#P#QCV#Q;'SBs;'S;=`Ci<%lOBskCYTO#PBs#P#Q%b#Q;'SBs;'S;=`Ci<%lOBskClP;=`<%lBsoCtPjP#P#QCwnC|O$hn~DRO$e~~DWOq~~D]O$Y~~DbOu~~DgP$[~!_!`$m",
tokenizers: [0, 1, 2, 3, 4],
topRules: {"Chunk":[0,2]},
dynamicPrecedences: {"144":1},
specialized: [{term: 135, get: (value) => spec_identifier[value] || -1}],
tokenPrec: 4960
})