Lua string parsing fixes

pull/1224/head
Zef Hemel 2025-01-21 09:08:31 +01:00
parent bd24bac6cd
commit 21c17ac737
3 changed files with 27 additions and 5 deletions

View File

@ -85,6 +85,7 @@ exp {
Query
}
Query {
kw<"query"> "[[" QueryClause* "]]"
}
@ -166,16 +167,21 @@ TableConstructor { "{" (field (fieldsep field)* fieldsep?)? "}" }
// Any sequence of characters except two consecutive ]]
longStringContent { (![\]] | $[\]] ![\]])* }
longDelimStringContent {
(![\]] | $[\]] ![=]+ ![\]])*
singleEqualStringContent {
(![\]] | $[\]] ![=] ![\]])* $[\]]* ![\]]*
}
doubleEqualStringContent {
(![\]] | $[\]] ![=] ![=] ![\]])* $[\]]* ![\]]*
}
simpleString {
"'" (stringEscape | ![\r\n\\'])* "'" |
'"' (stringEscape | ![\r\n\\"])* '"' |
'[[' longStringContent ']]' |
'[' '='+ '[' longDelimStringContent ']' '='+ ']'
'[=[' singleEqualStringContent ']=]' |
'[==[' doubleEqualStringContent ']==]'
}
hex { $[0-9a-fA-F] }

View File

@ -13,7 +13,7 @@ export const parser = LRParser.deserialize({
],
skippedNodes: [0,1],
repeatNodeCount: 11,
tokenData: ";y~RuXY#fYZ$Q[]#f]^$_pq#fqr$grs$rst)Yuv)_vw)dwx)ixy-zyz.Pz{.U{|.Z|}.`}!O.g!O!P/Z!P!Q/p!Q!R0Q!R![1f![!]3j!]!^3w!^!_4O!_!`4b!`!a4j!c!}4|!}#O5_#O#P#w#P#Q;O#Q#R;]#R#S4|#T#o4|#o#p;b#p#q;g#q#r;l#r#s;q~#kS#i~XY#f[]#fpq#f#O#P#w~#zQYZ#f]^#f~$VP#h~]^$Y~$_O#h~~$dP#h~YZ$Ym$jP!_!`$mm$rOzmk$uXOY$rZ]$r^r$rrs%bs#O$r#O#P%g#P;'S$r;'S;=`'w<%lO$rk%gO#mkk%jZrs$rwx$r!Q![&]#O#P$r#T#U$r#U#V$r#Y#Z$r#b#c$r#i#j'}#l#m(p#n#o$rk&`ZOY$rZ]$r^r$rrs%bs!Q$r!Q!['R![#O$r#O#P%g#P;'S$r;'S;=`'w<%lO$rk'UZOY$rZ]$r^r$rrs%bs!Q$r!Q![$r![#O$r#O#P%g#P;'S$r;'S;=`'w<%lO$rk'zP;=`<%l$rk(QP#o#p(Tk(WR!Q![(a!c!i(a#T#Z(ak(dS!Q![(a!c!i(a#T#Z(a#q#r$rk(sR!Q![(|!c!i(|#T#Z(|k)PR!Q![$r!c!i$r#T#Z$r~)_O$S~~)dO$P~~)iO#w~k)lXOY)iZ])i^w)iwx%bx#O)i#O#P*X#P;'S)i;'S;=`,i<%lO)ik*[Zrs)iwx)i!Q![*}#O#P)i#T#U)i#U#V)i#Y#Z)i#b#c)i#i#j,o#l#m-b#n#o)ik+QZOY)iZ])i^w)iwx%bx!Q)i!Q![+s![#O)i#O#P*X#P;'S)i;'S;=`,i<%lO)ik+vZOY)iZ])i^w)iwx%bx!Q)i!Q![)i![#O)i#O#P*X#P;'S)i;'S;=`,i<%lO)ik,lP;=`<%l)ik,rP#o#p,uk,xR!Q![-R!c!i-R#T#Z-Rk-US!Q![-R!c!i-R#T#Z-R#q#r)ik-eR!Q![-n!c!i-n#T#Z-nk-qR!Q![)i!c!i)i#T#Z)i~.POl~~.UOm~~.ZO#}~~.`O#{~o.gOvc#s[~.lP#|~}!O.o~.tTP~OY.oZ].o^;'S.o;'S;=`/T<%lO.o~/WP;=`<%l.oo/`Pgi!O!P/co/hP!Pm!O!P/kQ/pOcQ~/uQ$O~!P!Q/{!_!`$m~0QO$Q~~0VUd~!O!P0i!Q![1f!g!h0}!z!{1w#X#Y0}#l#m1w~0lP!Q![0o~0tRd~!Q![0o!g!h0}#X#Y0}~1QQ{|1W}!O1W~1ZP!Q![1^~1cPd~!Q![1^~1kSd~!O!P0i!Q![1f!g!h0}#X#Y0}~1zR!Q![2T!c!i2T#T#Z2T~2YUd~!O!P2l!Q![2T!c!i2T!r!s3^#T#Z2T#d#e3^~2oR!Q![2x!c!i2x#T#Z2x~2}Td~!Q![2x!c!i2x!r!s3^#T#Z2x#d#e3^~3aR{|1W}!O1W!P!Q1W~3oPo~![!]3r~3wOU~_4OOSR#s[o4VQ$[Qzm!^!_4]!_!`$mm4bO#ym~4gP#r~!_!`$mo4qQ$]Qzm!_!`$m!`!a4wm4|O#zm~5RS#k~!Q![4|!c!}4|#R#S4|#T#o4|o5dQik!_!`5j!}#O9nk5mQ!_!`5j!}#O5sk5vTO#P5s#P#Q6V#Q;'S5s;'S;=`9b<%lO5sk6YTO!_6i!_!`9R!`;'S6i;'S;=`9[<%lO6ik6lVO!_7R!_!`5s!`#P7R#P#Q6i#Q;'S7R;'S;=`9h<%lO7Rk7UVO!_7R!_!`5s!`#P7R#P#Q7k#Q;'S7R;'S;=`9h<%lO7Rk7nVO!_7R!_!`8T!`#P7R#P#Q6i#Q;'S7R;'S;=`9h<%lO7Rk8WVO!_5s!_!`8T!`#P5s#P#Q8m#Q;'S5s;'S;=`9b<%lO5sk8rT#mkO!_6i!_!`9R!`;'S6i;'S;=`9[<%lO6ik9UQ!_!`9R#P#Q%bk9_P;=`<%l6ik9eP;=`<%l5sk9kP;=`<%l7Ro9sT$USO#P:S#P#Q:f#Q;'S:S;'S;=`:x<%lO:Sk:VTO#P:S#P#Q:f#Q;'S:S;'S;=`:x<%lO:Sk:iTO#P:S#P#Q%b#Q;'S:S;'S;=`:x<%lO:Sk:{P;=`<%l:So;TPjP#P#Q;Wn;]O$Wn~;bO$R~~;gOq~~;lO#v~~;qOu~~;vP#x~!_!`$m",
tokenData: "Dg~RuXY#fYZ$Q[]#f]^$_pq#fqr$grs$rst)Yuv)_vw)dwx)ixy-zyz.Pz{.U{|.Z|}.`}!O.g!O!P/Z!P!Q/p!Q!R0Q!R![1f![!]3j!]!^3w!^!_4O!_!`4b!`!a4j!c!}4|!}#O5_#O#P#w#P#QCl#Q#RCy#R#S4|#T#o4|#o#pDO#p#qDT#q#rDY#r#sD_~#kS#i~XY#f[]#fpq#f#O#P#w~#zQYZ#f]^#f~$VP#h~]^$Y~$_O#h~~$dP#h~YZ$Ym$jP!_!`$mm$rOzmk$uXOY$rZ]$r^r$rrs%bs#O$r#O#P%g#P;'S$r;'S;=`'w<%lO$rk%gO#mkk%jZrs$rwx$r!Q![&]#O#P$r#T#U$r#U#V$r#Y#Z$r#b#c$r#i#j'}#l#m(p#n#o$rk&`ZOY$rZ]$r^r$rrs%bs!Q$r!Q!['R![#O$r#O#P%g#P;'S$r;'S;=`'w<%lO$rk'UZOY$rZ]$r^r$rrs%bs!Q$r!Q![$r![#O$r#O#P%g#P;'S$r;'S;=`'w<%lO$rk'zP;=`<%l$rk(QP#o#p(Tk(WR!Q![(a!c!i(a#T#Z(ak(dS!Q![(a!c!i(a#T#Z(a#q#r$rk(sR!Q![(|!c!i(|#T#Z(|k)PR!Q![$r!c!i$r#T#Z$r~)_O$S~~)dO$P~~)iO#w~k)lXOY)iZ])i^w)iwx%bx#O)i#O#P*X#P;'S)i;'S;=`,i<%lO)ik*[Zrs)iwx)i!Q![*}#O#P)i#T#U)i#U#V)i#Y#Z)i#b#c)i#i#j,o#l#m-b#n#o)ik+QZOY)iZ])i^w)iwx%bx!Q)i!Q![+s![#O)i#O#P*X#P;'S)i;'S;=`,i<%lO)ik+vZOY)iZ])i^w)iwx%bx!Q)i!Q![)i![#O)i#O#P*X#P;'S)i;'S;=`,i<%lO)ik,lP;=`<%l)ik,rP#o#p,uk,xR!Q![-R!c!i-R#T#Z-Rk-US!Q![-R!c!i-R#T#Z-R#q#r)ik-eR!Q![-n!c!i-n#T#Z-nk-qR!Q![)i!c!i)i#T#Z)i~.POl~~.UOm~~.ZO#}~~.`O#{~o.gOvc#s[~.lP#|~}!O.o~.tTP~OY.oZ].o^;'S.o;'S;=`/T<%lO.o~/WP;=`<%l.oo/`Pgi!O!P/co/hP!Pm!O!P/kQ/pOcQ~/uQ$O~!P!Q/{!_!`$m~0QO$Q~~0VUd~!O!P0i!Q![1f!g!h0}!z!{1w#X#Y0}#l#m1w~0lP!Q![0o~0tRd~!Q![0o!g!h0}#X#Y0}~1QQ{|1W}!O1W~1ZP!Q![1^~1cPd~!Q![1^~1kSd~!O!P0i!Q![1f!g!h0}#X#Y0}~1zR!Q![2T!c!i2T#T#Z2T~2YUd~!O!P2l!Q![2T!c!i2T!r!s3^#T#Z2T#d#e3^~2oR!Q![2x!c!i2x#T#Z2x~2}Td~!Q![2x!c!i2x!r!s3^#T#Z2x#d#e3^~3aR{|1W}!O1W!P!Q1W~3oPo~![!]3r~3wOU~_4OOSR#s[o4VQ$[Qzm!^!_4]!_!`$mm4bO#ym~4gP#r~!_!`$mo4qQ$]Qzm!_!`$m!`!a4wm4|O#zm~5RS#k~!Q![4|!c!}4|#R#S4|#T#o4|o5dQik!_!`5j!}#OB[k5mQ!_!`5s!}#O=lk5vP!}#O5yk5|TO#P5y#P#Q6]#Q;'S5y;'S;=`8T<%lO5yk6`VO!_6u!_!`:p!`#P6u#P#Q;t#Q;'S6u;'S;=`=f<%lO6uk6xVO!_7_!_!`8Z!`#P7_#P#Q8s#Q;'S7_;'S;=`=`<%lO7_k7bTO#P5y#P#Q7q#Q;'S5y;'S;=`8T<%lO5yk7tP!_!`7wk7zP!_!`7}k8QP#P#Q%bk8WP;=`<%l5yk8^TO#P8Z#P#Q7q#Q;'S8Z;'S;=`8m<%lO8Zk8pP;=`<%l8Zk8vUO!_5y!_!`9Y!`#P5y#Q;'S5y;'S;=`8T<%lO5yk9]VO!_5y!_!`9r!`#P5y#P#Q6]#Q;'S5y;'S;=`8T<%lO5yk9uTO#P5y#P#Q:U#Q;'S5y;'S;=`8T<%lO5yk:ZV#mkO!_6u!_!`:p!`#P6u#P#Q;t#Q;'S6u;'S;=`=f<%lO6uk:sVO!_8Z!_!`;Y!`#P8Z#P#Q7q#Q;'S8Z;'S;=`8m<%lO8Zk;]TO#P8Z#P#Q;l#Q;'S8Z;'S;=`8m<%lO8Zk;qP#mk!_!`7wk;wVO!_7_!_!`:p!`#P7_#P#Q<^#Q;'S7_;'S;=`=`<%lO7_k<aVO!_5y!_!`9Y!`#P5y#P#Q<v#Q;'S5y;'S;=`8T<%lO5yk<yVO!_8Z!_!`:p!`#P8Z#P#Q<v#Q;'S8Z;'S;=`8m<%lO8Zk=cP;=`<%l7_k=iP;=`<%l6uk=oTO#P=l#P#Q>O#Q;'S=l;'S;=`>z<%lO=lk>RVO!_>h!_!`?Q!`#P>h#P#Q@U#Q;'S>h;'S;=`Al<%lO>hk>kTO#P=l#P#Q7w#Q;'S=l;'S;=`>z<%lO=lk>}P;=`<%l=lk?TTO#P?d#P#Q?|#Q;'S?d;'S;=`?v<%lO?dk?gTO#P?d#P#Q7w#Q;'S?d;'S;=`?v<%lO?dk?yP;=`<%l?dk@RP#mk!_!`7}k@XVO!_=l!_!`@n!`#P=l#P#QAr#Q;'S=l;'S;=`>z<%lO=lk@qTO#P=l#P#QAQ#Q;'S=l;'S;=`>z<%lO=lkAVV#mkO!_>h!_!`?Q!`#P>h#P#Q@U#Q;'S>h;'S;=`Al<%lO>hkAoP;=`<%l>hkAuVO!_?d!_!`?Q!`#P?d#P#QAr#Q;'S?d;'S;=`?v<%lO?doBaT$USO#PBp#P#QCS#Q;'SBp;'S;=`Cf<%lOBpkBsTO#PBp#P#QCS#Q;'SBp;'S;=`Cf<%lOBpkCVTO#PBp#P#Q%b#Q;'SBp;'S;=`Cf<%lOBpkCiP;=`<%lBpoCqPjP#P#QCtnCyO$Wn~DOO$R~~DTOq~~DYO#v~~D_Ou~~DdP#x~!_!`$m",
tokenizers: [0, 1, 2, 3, 4],
topRules: {"Chunk":[0,2]},
dynamicPrecedences: {"128":1},

View File

@ -14,6 +14,22 @@ Deno.test("Test Lua parser", () => {
parse(`e([[hel]lo]], "Grinny face\\u{1F600}")`);
parse(`e([=[Hello page [[index]] end scene]=], [[yo]])`);
// console.log(
// JSON.stringify(
parse(`e([==[Hello page [[index]] end scene]==], [==[yo]==])`),
// null,
// 2,
// ),
// );
console.log(
JSON.stringify(
parse(`e([==[Hello page [[bla]]
]==])`),
null,
2,
),
);
parse(`e(10 << 10, 10 >> 10, 10 & 10, 10 | 10, 10 ~ 10)`);
parse(`e(true and false or true)`);