update params scope detection, add array.1 (dotget array indices)
This commit is contained in:
parent
abd7d2e43b
commit
972fd25fda
|
|
@ -70,9 +70,9 @@ export const getFunctionDefParts = (node: SyntaxNode, input: string) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const paramNames = getAllChildren(paramsNode).map((param) => {
|
const paramNames = getAllChildren(paramsNode).map((param) => {
|
||||||
if (param.type.id !== terms.AssignableIdentifier) {
|
if (param.type.id !== terms.Identifier) {
|
||||||
throw new CompilerError(
|
throw new CompilerError(
|
||||||
`FunctionDef params must be AssignableIdentifiers, got ${param.type.name}`,
|
`FunctionDef params must be Identifier, got ${param.type.name}`,
|
||||||
param.from,
|
param.from,
|
||||||
param.to
|
param.to
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -57,26 +57,30 @@ const readIdentifierText = (input: InputStream, start: number, end: number): str
|
||||||
return text
|
return text
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let inParams = false
|
||||||
|
|
||||||
export const trackScope = new ContextTracker<TrackerContext>({
|
export const trackScope = new ContextTracker<TrackerContext>({
|
||||||
start: new TrackerContext(new Scope(null, new Set())),
|
start: new TrackerContext(new Scope(null, new Set())),
|
||||||
|
|
||||||
shift(context, term, stack, input) {
|
shift(context, term, stack, input) {
|
||||||
if (term !== terms.AssignableIdentifier) return context
|
if (term == terms.Do) inParams = true
|
||||||
|
|
||||||
const text = readIdentifierText(input, input.pos, stack.pos)
|
if (term === terms.AssignableIdentifier) {
|
||||||
return new TrackerContext(context.scope, [...context.pendingIds, text])
|
const text = readIdentifierText(input, input.pos, stack.pos)
|
||||||
|
return new TrackerContext(Scope.add(context.scope, text), context.pendingIds)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inParams && term === terms.Identifier) {
|
||||||
|
const text = readIdentifierText(input, input.pos, stack.pos)
|
||||||
|
return new TrackerContext(context.scope, [...context.pendingIds, text])
|
||||||
|
}
|
||||||
|
|
||||||
|
return context
|
||||||
},
|
},
|
||||||
|
|
||||||
reduce(context, term) {
|
reduce(context, term) {
|
||||||
// Add assignment variable to scope
|
|
||||||
if (term === terms.Assign) {
|
|
||||||
const varName = context.pendingIds.at(-1)
|
|
||||||
if (!varName) return context
|
|
||||||
return new TrackerContext(Scope.add(context.scope, varName), context.pendingIds.slice(0, -1))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Push new scope and add all parameters
|
|
||||||
if (term === terms.Params) {
|
if (term === terms.Params) {
|
||||||
|
inParams = false
|
||||||
let newScope = context.scope.push()
|
let newScope = context.scope.push()
|
||||||
if (context.pendingIds.length > 0) {
|
if (context.pendingIds.length > 0) {
|
||||||
newScope = Scope.add(newScope, ...context.pendingIds)
|
newScope = Scope.add(newScope, ...context.pendingIds)
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
@external tokens tokenizer from "./tokenizer" { Identifier, AssignableIdentifier, Word, IdentifierBeforeDot }
|
@external tokens tokenizer from "./tokenizer" { Identifier, AssignableIdentifier, Word, IdentifierBeforeDot }
|
||||||
|
@external specialize {Identifier} specializeKeyword from "./tokenizer" { Do }
|
||||||
|
|
||||||
@precedence {
|
@precedence {
|
||||||
pipe @left,
|
pipe @left,
|
||||||
|
|
@ -91,11 +92,11 @@ FunctionDef {
|
||||||
}
|
}
|
||||||
|
|
||||||
singleLineFunctionDef {
|
singleLineFunctionDef {
|
||||||
@specialize[@name=keyword]<Identifier, "do"> Params colon consumeToTerminator @specialize[@name=keyword]<Identifier, "end">
|
Do Params colon consumeToTerminator @specialize[@name=keyword]<Identifier, "end">
|
||||||
}
|
}
|
||||||
|
|
||||||
multilineFunctionDef {
|
multilineFunctionDef {
|
||||||
@specialize[@name=keyword]<Identifier, "do"> Params colon newlineOrSemicolon block @specialize[@name=keyword]<Identifier, "end">
|
Do Params colon newlineOrSemicolon block @specialize[@name=keyword]<Identifier, "end">
|
||||||
}
|
}
|
||||||
|
|
||||||
IfExpr {
|
IfExpr {
|
||||||
|
|
@ -134,7 +135,7 @@ ConditionalOp {
|
||||||
}
|
}
|
||||||
|
|
||||||
Params {
|
Params {
|
||||||
AssignableIdentifier*
|
Identifier*
|
||||||
}
|
}
|
||||||
|
|
||||||
Assign {
|
Assign {
|
||||||
|
|
@ -163,7 +164,7 @@ expression {
|
||||||
|
|
||||||
@skip {} {
|
@skip {} {
|
||||||
DotGet {
|
DotGet {
|
||||||
IdentifierBeforeDot dot Identifier
|
IdentifierBeforeDot dot (Number | Identifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
String { "'" stringContent* "'" }
|
String { "'" stringContent* "'" }
|
||||||
|
|
|
||||||
|
|
@ -16,24 +16,25 @@ export const
|
||||||
AssignableIdentifier = 14,
|
AssignableIdentifier = 14,
|
||||||
Word = 15,
|
Word = 15,
|
||||||
IdentifierBeforeDot = 16,
|
IdentifierBeforeDot = 16,
|
||||||
Program = 17,
|
Do = 17,
|
||||||
PipeExpr = 18,
|
Program = 18,
|
||||||
FunctionCall = 19,
|
PipeExpr = 19,
|
||||||
DotGet = 20,
|
FunctionCall = 20,
|
||||||
PositionalArg = 21,
|
DotGet = 21,
|
||||||
ParenExpr = 22,
|
Number = 22,
|
||||||
FunctionCallOrIdentifier = 23,
|
PositionalArg = 23,
|
||||||
BinOp = 24,
|
ParenExpr = 24,
|
||||||
ConditionalOp = 25,
|
FunctionCallOrIdentifier = 25,
|
||||||
FunctionDef = 26,
|
BinOp = 26,
|
||||||
|
ConditionalOp = 27,
|
||||||
|
FunctionDef = 28,
|
||||||
|
Params = 29,
|
||||||
|
colon = 30,
|
||||||
keyword = 50,
|
keyword = 50,
|
||||||
Params = 28,
|
String = 32,
|
||||||
colon = 29,
|
StringFragment = 33,
|
||||||
String = 31,
|
Interpolation = 34,
|
||||||
StringFragment = 32,
|
EscapeSeq = 35,
|
||||||
Interpolation = 33,
|
|
||||||
EscapeSeq = 34,
|
|
||||||
Number = 35,
|
|
||||||
Boolean = 36,
|
Boolean = 36,
|
||||||
Regex = 37,
|
Regex = 37,
|
||||||
Null = 38,
|
Null = 38,
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,27 @@
|
||||||
// This file was generated by lezer-generator. You probably shouldn't edit it.
|
// This file was generated by lezer-generator. You probably shouldn't edit it.
|
||||||
import {LRParser, LocalTokenGroup} from "@lezer/lr"
|
import {LRParser, LocalTokenGroup} from "@lezer/lr"
|
||||||
import {operatorTokenizer} from "./operatorTokenizer"
|
import {operatorTokenizer} from "./operatorTokenizer"
|
||||||
import {tokenizer} from "./tokenizer"
|
import {tokenizer, specializeKeyword} from "./tokenizer"
|
||||||
import {trackScope} from "./scopeTracker"
|
import {trackScope} from "./scopeTracker"
|
||||||
import {highlighting} from "./highlight"
|
import {highlighting} from "./highlight"
|
||||||
const spec_Identifier = {__proto__:null,do:54, end:60, null:76, if:88, elseif:96, else:100}
|
const spec_Identifier = {__proto__:null,end:62, null:76, if:88, elseif:96, else:100}
|
||||||
export const parser = LRParser.deserialize({
|
export const parser = LRParser.deserialize({
|
||||||
version: 14,
|
version: 14,
|
||||||
states: ".jQVQbOOO!QOpO'#CpO#^QcO'#CsO$WQRO'#CtO$fQcO'#DmO$}QbO'#DtOOQ`'#Cv'#CvO%VQbO'#CrO%wOSO'#C{OOQa'#Dr'#DrO&VQcO'#DqOOQ`'#Dn'#DnO&nQbO'#DmO&|QbO'#EQOOQ`'#DX'#DXO'kQRO'#DaOOQ`'#Dm'#DmO'pQQO'#DlOOQ`'#Dl'#DlOOQ`'#Db'#DbQVQbOOO'xO`O,59[OOQa'#Dq'#DqOOQ`'#Cq'#CqO'}QbO'#DUOOQ`'#Dp'#DpOOQ`'#Dc'#DcO(XQbO,59ZO&|QbO,59`O&|QbO,59`OOQ`'#Dd'#DdO(uQbO'#CxO(}QQO,5:`O)nQRO'#CtO*OQRO,59^O*aQRO,59^O*[QQO,59^O+[QQO,59^O+dQbO'#C}O+lQWO'#DOOOOO'#Dz'#DzOOOO'#Df'#DfO,QOSO,59gOOQa,59g,59gO,`QbO'#DgO,hQbO,59YO,yQRO,5:lO-QQQO,5:lO-VQbO,59{OOQ`,5:W,5:WOOQ`-E7`-E7`OOQa1G.v1G.vOOQ`,59p,59pOOQ`-E7a-E7aOOQa1G.z1G.zO-aQcO1G.zOOQ`-E7b-E7bO-{QbO1G/zO&|QbO,59aO&|QbO,59aOOQa1G.x1G.xOOOO,59i,59iOOOO,59j,59jOOOO-E7d-E7dOOQa1G/R1G/RO!VQbO'#CsOOQ`,5:R,5:ROOQ`-E7e-E7eO.YQbO1G0WOOQ`1G/g1G/gO.gQbO7+%fO.lQbO7+%gOOQO1G.{1G.{O.yQRO1G.{OOQ`'#DZ'#DZOOQ`7+%r7+%rO/TQbO7+%sOOQ`<<IQ<<IQO/hQQO'#DeO/mQbO'#DwO0QQbO<<IROOQ`'#D['#D[O0VQbO<<I_OOQ`,5:P,5:POOQ`-E7c-E7cOOQ`AN>mAN>mO&|QbO'#D]OOQ`'#Dh'#DhO0bQbOAN>yO0mQQO'#D_OOQ`AN>yAN>yO0rQbOAN>yO0wQRO,59wO1OQQO,59wOOQ`-E7f-E7fOOQ`G24eG24eO1TQbOG24eO1YQQO,59yO1_QQO1G/cOOQ`LD*PLD*PO.lQbO1G/eO/TQbO7+$}OOQ`7+%P7+%POOQ`<<Hi<<Hi",
|
states: ".jQVQbOOO!QOpO'#CqO#^QcO'#CuO$WQRO'#CvO$fQcO'#DmO$}QbO'#DtOOQ`'#Cx'#CxO%VQbO'#CtO%wOSO'#C|OOQa'#Dr'#DrO&VQcO'#DqOOQ`'#Dn'#DnO&nQbO'#DmO&|QbO'#EQOOQ`'#DX'#DXO'kQRO'#DaOOQ`'#Dm'#DmO'pQQO'#DlOOQ`'#Dl'#DlOOQ`'#Db'#DbQVQbOOO'xObO,59]OOQa'#Dq'#DqOOQ`'#Cs'#CsO(QQbO'#DUOOQ`'#Dp'#DpOOQ`'#Dc'#DcO([QbO,59[O&|QbO,59bO&|QbO,59bOOQ`'#Dd'#DdO(xQbO'#CyO)QQQO,5:`O)qQRO'#CvO*RQRO,59`O*dQRO,59`O*_QQO,59`O+_QQO,59`O+gQbO'#DOO+oQWO'#DPOOOO'#Dz'#DzOOOO'#Df'#DfO,TOSO,59hOOQa,59h,59hO,cQbO'#DgO,kQbO,59ZO,|QRO,5:lO-TQQO,5:lO-YQbO,59{OOQ`,5:W,5:WOOQ`-E7`-E7`OOQa1G.w1G.wOOQ`,59p,59pOOQ`-E7a-E7aOOQa1G.|1G.|O-dQcO1G.|OOQ`-E7b-E7bO.OQbO1G/zO&|QbO,59cO&|QbO,59cOOQa1G.z1G.zOOOO,59j,59jOOOO,59k,59kOOOO-E7d-E7dOOQa1G/S1G/SO!VQbO'#CuOOQ`,5:R,5:ROOQ`-E7e-E7eO.]QbO1G0WOOQ`1G/g1G/gO.jQbO7+%fO.oQbO7+%gOOQO1G.}1G.}O.|QRO1G.}OOQ`'#DZ'#DZOOQ`7+%r7+%rO/WQbO7+%sOOQ`<<IQ<<IQO/kQQO'#DeO/pQbO'#DwO0TQbO<<IROOQ`'#D['#D[O0YQbO<<I_OOQ`,5:P,5:POOQ`-E7c-E7cOOQ`AN>mAN>mO&|QbO'#D]OOQ`'#Dh'#DhO0eQbOAN>yO0pQQO'#D_OOQ`AN>yAN>yO0uQbOAN>yO0zQRO,59wO1RQQO,59wOOQ`-E7f-E7fOOQ`G24eG24eO1WQbOG24eO1]QQO,59yO1bQQO1G/cOOQ`LD*PLD*PO.oQbO1G/eO/WQbO7+$}OOQ`7+%P7+%POOQ`<<Hi<<Hi",
|
||||||
stateData: "1g~O!_OS~O]QO^_O_XO`POkTOsXOtXOuXOvXO|]O!gVO!jbO!mWO~O!ceO~O]fO_XO`POkTOsXOtXOuXOvXOwgOyhO!gVO!mWOzgX!jgX!vgX!lgXngX~OP!eXQ!eXR!eXS!eXT!eXU!eXV!eXW!eXX!eXY!eXZ!eX[!eX~P!VOPlOQlORmOSmO~OPlOQlORmOSmO!j!aX!v!aXn!aX~O^nOmlP~O]QO_XO`POkTOsXOtXOuXOvXO!gVO!mWO~OpxO!m{O!ovO!pwO~OP!eXQ!eXR!eXS!eX!j!aX!v!aXn!aX~Oz|O!j!aX!v!aXn!aX~O]fO_XO`POsXOtXOuXOvXO!gVO!mWO~OV!QO~O!j!RO!v!RO~O]!TO~OkTOw!UO~P&|OkTOwgOyhOzca!jca!vca!lcanca~P&|O^nOmlX~Om!ZO~OT!]OU!]OV![OW![OX![OY![OZ![O[![O~OPlOQlORmOSmO~P)SOPlOQlORmOSmO!l!^O~O!l!^OP!eXQ!eXR!eXS!eXT!eXU!eXV!eXW!eXX!eXY!eXZ!eX[!eX~Oz|O!l!^O~O]!_O!gVO~O!m!`O!o!`O!p!`O!q!`O!r!`O!s!`O~OpxO!m!bO!ovO!pwO~O]!cO`PO~Oz|O!jba!vba!lbanba~Om!fO~P)SOm!fO~O^_O|]O~P%VOPlOQlORhiShi!jhi!vhi!lhinhi~O^_O|]O!j!iO~P%VO^_O|]O!j!nO~P%VOn!oO~O^_O|]On!kP~P%VO!liimii~P)SO^_O|]On!kP!Q!kP!S!kP~P%VO!j!uO~O^_O|]On!kX!Q!kX!S!kX~P%VOn!wO~On!|O!Q!xO!S!{O~On#RO!Q!xO!S!{O~Om#TO~On#RO~Om#UO~P)SOm#UO~On#VO~O!j#WO~O!j#XO~Osu~",
|
stateData: "1j~O!_OS~O]QO^_O_XO`POaTOfXOtXOuXOvXO|]O!gVO!jbO!mWO~O!ceO~O]fO_XO`POaTOfXOtXOuXOvXOwgOyhO!gVO!mWOziX!jiX!viX!liXoiX~OP!eXQ!eXR!eXS!eXT!eXU!eXV!eXW!eXX!eXY!eXZ!eX[!eX~P!VOPlOQlORmOSmO~OPlOQlORmOSmO!j!aX!v!aXo!aX~O]nOnmP~O]QO_XO`POaTOfXOtXOuXOvXO!gVO!mWO~OqxO!m{O!ovO!pwO~OP!eXQ!eXR!eXS!eX!j!aX!v!aXo!aX~Oz|O!j!aX!v!aXo!aX~O]fO_XO`POfXOtXOuXOvXO!gVO!mWO~OV!QO~O!j!RO!v!RO~O]!TOf!TO~OaTOw!UO~P&|OaTOwgOyhOzda!jda!vda!ldaoda~P&|O]nOnmX~On!ZO~OT!]OU!]OV![OW![OX![OY![OZ![O[![O~OPlOQlORmOSmO~P)VOPlOQlORmOSmO!l!^O~O!l!^OP!eXQ!eXR!eXS!eXT!eXU!eXV!eXW!eXX!eXY!eXZ!eX[!eX~Oz|O!l!^O~O]!_O!gVO~O!m!`O!o!`O!p!`O!q!`O!r!`O!s!`O~OqxO!m!bO!ovO!pwO~O]!cO`PO~Oz|O!jca!vca!lcaoca~On!fO~P)VOn!fO~O^_O|]O~P%VOPlOQlORjiSji!jji!vji!ljioji~O^_O|]O!j!iO~P%VO^_O|]O!j!nO~P%VOo!oO~O^_O|]Oo!kP~P%VO!lkinki~P)VO^_O|]Oo!kP!Q!kP!S!kP~P%VO!j!uO~O^_O|]Oo!kX!Q!kX!S!kX~P%VOo!wO~Oo!|O!Q!xO!S!{O~Oo#RO!Q!xO!S!{O~On#TO~Oo#RO~On#UO~P)VOn#UO~Oo#VO~O!j#WO~O!j#XO~Ofu~",
|
||||||
goto: "+t!vPPPPPPPPPPPPPPPPPP!w#W#f$S$X#W$s%Y%fP%}PP&QP&i&iPPPPP$SPP&mP&y&|'VP'ZP&m'a'g'n't'}(T([PPP(b(f(zP)^)c*^P*y*yP+[PP+dPPPPP+h+hd`Od!Q!Z!f!i!n!q#W#XRtViZOVd|!Q!Z!f!i!n!q#W#XfQOVd!Q!Z!f!i!n!q#W#XdfQ]hklm![!]!c!xR!c|ViQk!czXOQV]dhklm!Q!Z![!]!c!f!i!n!q!x#W#XR!_vdSOd!Q!Z!f!i!n!q#W#XQrVQ!WlR!XmQtVQ!P]Q!j!]R#P!xd`Od!Q!Z!f!i!n!q#W#XUgQk!cQtVR!UhRpT{XOQV]dhklm!Q!Z![!]!c!f!i!n!q!x#W#XTxWze`Od!Q!Z!f!i!n!q#W#XR!m!fQ!t!nQ#Y#WR#Z#XT!y!t!zQ!}!tR#S!zQdOR!SdSkQ!cR!VkQoTR!YoW!q!i!n#W#XR!v!qQzWR!azS}[uR!e}Q!z!tR#Q!zTcOdSaOdQ!g!QQ!h!ZQ!l!fZ!p!i!n!q#W#Xd[Od!Q!Z!f!i!n!q#W#XQuVR!d|VjQk!cdROd!Q!Z!f!i!n!q#W#XUgQk!cQqVQ!O]Q!UhQ!WlQ!XmQ!j![Q!k!]R#O!xdYOd!Q!Z!f!i!n!q#W#XdfQ]hklm![!]!c!xRsVoUOQVdhk!Q!Z!c!f!i!n!q#W#XQ!r!iV!s!n#W#XTyWze^Od!Q!Z!f!i!n!q#W#X",
|
goto: "+t!vPPPPPPPPPPPPPPPPPPP!w#W#fP$S$X#W$s%Y%f%}PP&QP&i&iPPPP$SPP&mP&y&|'VP'ZP&m'a'g'n't'}(T([PPP(b(f(zP)^)c*^P*y*yP+[PP+dPPPPP+h+hd`Od!Q!Z!f!i!n!q#W#XRtViZOVd|!Q!Z!f!i!n!q#W#XfQOVd!Q!Z!f!i!n!q#W#XdfQ]hklm![!]!c!xR!c|ViQk!czXOQV]dhklm!Q!Z![!]!c!f!i!n!q!x#W#XR!_vdSOd!Q!Z!f!i!n!q#W#XQrVQ!WlR!XmQtVQ!P]Q!j!]R#P!xd`Od!Q!Z!f!i!n!q#W#XUgQk!cQtVR!UhRpT{XOQV]dhklm!Q!Z![!]!c!f!i!n!q!x#W#XTxWze`Od!Q!Z!f!i!n!q#W#XR!m!fQ!t!nQ#Y#WR#Z#XT!y!t!zQ!}!tR#S!zQdOR!SdSkQ!cR!VkQoTR!YoW!q!i!n#W#XR!v!qQzWR!azS}[uR!e}Q!z!tR#Q!zTcOdSaOdQ!g!QQ!h!ZQ!l!fZ!p!i!n!q#W#Xd[Od!Q!Z!f!i!n!q#W#XQuVR!d|VjQk!cdROd!Q!Z!f!i!n!q#W#XUgQk!cQqVQ!O]Q!UhQ!WlQ!XmQ!j![Q!k!]R#O!xdYOd!Q!Z!f!i!n!q#W#XdfQ]hklm![!]!c!xRsVoUOQVdhk!Q!Z!c!f!i!n!q#W#XQ!r!iV!s!n#W#XTyWze^Od!Q!Z!f!i!n!q#W#X",
|
||||||
nodeNames: "⚠ Star Slash Plus Minus And Or Eq Neq Lt Lte Gt Gte Identifier AssignableIdentifier Word IdentifierBeforeDot Program PipeExpr FunctionCall DotGet PositionalArg ParenExpr FunctionCallOrIdentifier BinOp ConditionalOp FunctionDef keyword Params colon keyword String StringFragment Interpolation EscapeSeq Number Boolean Regex Null Underscore NamedArg NamedArgPrefix operator IfExpr keyword ThenBlock ThenBlock ElseIfExpr keyword ElseExpr keyword Assign",
|
nodeNames: "⚠ Star Slash Plus Minus And Or Eq Neq Lt Lte Gt Gte Identifier AssignableIdentifier Word IdentifierBeforeDot Do Program PipeExpr FunctionCall DotGet Number PositionalArg ParenExpr FunctionCallOrIdentifier BinOp ConditionalOp FunctionDef Params colon keyword String StringFragment Interpolation EscapeSeq Boolean Regex Null Underscore NamedArg NamedArgPrefix operator IfExpr keyword ThenBlock ThenBlock ElseIfExpr keyword ElseExpr keyword Assign",
|
||||||
maxTerm: 84,
|
maxTerm: 84,
|
||||||
context: trackScope,
|
context: trackScope,
|
||||||
nodeProps: [
|
nodeProps: [
|
||||||
["closedBy", 29,"end"]
|
["closedBy", 30,"end"]
|
||||||
],
|
],
|
||||||
propSources: [highlighting],
|
propSources: [highlighting],
|
||||||
skippedNodes: [0],
|
skippedNodes: [0],
|
||||||
repeatNodeCount: 7,
|
repeatNodeCount: 7,
|
||||||
tokenData: "<}~RyOX#rXY$aYZ$zZp#rpq$aqt#rtu%euw#rwx%jxy%oyz&Yz{#r{|&s|}#r}!O&s!O!P#r!P!Q)g!Q!['b![!]2S!]!^$z!^#O#r#O#P2m#P#R#r#R#S2r#S#T#r#T#Y3]#Y#Z4k#Z#b3]#b#c8y#c#f3]#f#g9p#g#h3]#h#i:g#i#o3]#o#p#r#p#q<_#q;'S#r;'S;=`$Z<%l~#r~O#r~~<xS#wUpSOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rS$^P;=`<%l#r^$hUpS!_YOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU%RUpS!jQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#r~%jO!o~~%oO!m~U%vUpS!gQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU&aUpS!lQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU&xWpSOt#ruw#rx!Q#r!Q!['b![#O#r#P;'S#r;'S;=`$Z<%lO#rU'iYpSsQOt#ruw#rx!O#r!O!P(X!P!Q#r!Q!['b![#O#r#P;'S#r;'S;=`$Z<%lO#rU(^WpSOt#ruw#rx!Q#r!Q![(v![#O#r#P;'S#r;'S;=`$Z<%lO#rU(}WpSsQOt#ruw#rx!Q#r!Q![(v![#O#r#P;'S#r;'S;=`$Z<%lO#rU)lWpSOt#ruw#rx!P#r!P!Q*U!Q#O#r#P;'S#r;'S;=`$Z<%lO#rU*Z^pSOY+VYZ#rZt+Vtu,Yuw+Vwx,Yx!P+V!P!Q#r!Q!}+V!}#O0{#O#P.h#P;'S+V;'S;=`1|<%lO+VU+^^pSuQOY+VYZ#rZt+Vtu,Yuw+Vwx,Yx!P+V!P!Q.}!Q!}+V!}#O0{#O#P.h#P;'S+V;'S;=`1|<%lO+VQ,_XuQOY,YZ!P,Y!P!Q,z!Q!},Y!}#O-i#O#P.h#P;'S,Y;'S;=`.w<%lO,YQ,}P!P!Q-QQ-VUuQ#Z#[-Q#]#^-Q#a#b-Q#g#h-Q#i#j-Q#m#n-QQ-lVOY-iZ#O-i#O#P.R#P#Q,Y#Q;'S-i;'S;=`.b<%lO-iQ.USOY-iZ;'S-i;'S;=`.b<%lO-iQ.eP;=`<%l-iQ.kSOY,YZ;'S,Y;'S;=`.w<%lO,YQ.zP;=`<%l,YU/SWpSOt#ruw#rx!P#r!P!Q/l!Q#O#r#P;'S#r;'S;=`$Z<%lO#rU/sbpSuQOt#ruw#rx#O#r#P#Z#r#Z#[/l#[#]#r#]#^/l#^#a#r#a#b/l#b#g#r#g#h/l#h#i#r#i#j/l#j#m#r#m#n/l#n;'S#r;'S;=`$Z<%lO#rU1Q[pSOY0{YZ#rZt0{tu-iuw0{wx-ix#O0{#O#P.R#P#Q+V#Q;'S0{;'S;=`1v<%lO0{U1yP;=`<%l0{U2PP;=`<%l+VU2ZUpSmQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#r~2rO!p~U2yUpSwQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU3bYpSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#o3]#o;'S#r;'S;=`$Z<%lO#rU4XUyQpSOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU4pZpSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#U5c#U#o3]#o;'S#r;'S;=`$Z<%lO#rU5h[pSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#`3]#`#a6^#a#o3]#o;'S#r;'S;=`$Z<%lO#rU6c[pSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#g3]#g#h7X#h#o3]#o;'S#r;'S;=`$Z<%lO#rU7^[pSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#X3]#X#Y8S#Y#o3]#o;'S#r;'S;=`$Z<%lO#rU8ZYtQpSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#o3]#o;'S#r;'S;=`$Z<%lO#r^9QY!qWpSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#o3]#o;'S#r;'S;=`$Z<%lO#r^9wY!sWpSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#o3]#o;'S#r;'S;=`$Z<%lO#r^:n[!rWpSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#f3]#f#g;d#g#o3]#o;'S#r;'S;=`$Z<%lO#rU;i[pSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#i3]#i#j7X#j#o3]#o;'S#r;'S;=`$Z<%lO#rU<fUzQpSOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#r~<}O!v~",
|
tokenData: "<}~RyOX#rXY$aYZ$zZp#rpq$aqt#rtu%euw#rwx%jxy%oyz&Yz{#r{|&s|}#r}!O&s!O!P#r!P!Q)g!Q!['b![!]2S!]!^$z!^#O#r#O#P2m#P#R#r#R#S2r#S#T#r#T#Y3]#Y#Z4k#Z#b3]#b#c8y#c#f3]#f#g9p#g#h3]#h#i:g#i#o3]#o#p#r#p#q<_#q;'S#r;'S;=`$Z<%l~#r~O#r~~<xS#wUqSOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rS$^P;=`<%l#r^$hUqS!_YOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU%RUqS!jQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#r~%jO!o~~%oO!m~U%vUqS!gQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU&aUqS!lQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU&xWqSOt#ruw#rx!Q#r!Q!['b![#O#r#P;'S#r;'S;=`$Z<%lO#rU'iYqSfQOt#ruw#rx!O#r!O!P(X!P!Q#r!Q!['b![#O#r#P;'S#r;'S;=`$Z<%lO#rU(^WqSOt#ruw#rx!Q#r!Q![(v![#O#r#P;'S#r;'S;=`$Z<%lO#rU(}WqSfQOt#ruw#rx!Q#r!Q![(v![#O#r#P;'S#r;'S;=`$Z<%lO#rU)lWqSOt#ruw#rx!P#r!P!Q*U!Q#O#r#P;'S#r;'S;=`$Z<%lO#rU*Z^qSOY+VYZ#rZt+Vtu,Yuw+Vwx,Yx!P+V!P!Q#r!Q!}+V!}#O0{#O#P.h#P;'S+V;'S;=`1|<%lO+VU+^^qSuQOY+VYZ#rZt+Vtu,Yuw+Vwx,Yx!P+V!P!Q.}!Q!}+V!}#O0{#O#P.h#P;'S+V;'S;=`1|<%lO+VQ,_XuQOY,YZ!P,Y!P!Q,z!Q!},Y!}#O-i#O#P.h#P;'S,Y;'S;=`.w<%lO,YQ,}P!P!Q-QQ-VUuQ#Z#[-Q#]#^-Q#a#b-Q#g#h-Q#i#j-Q#m#n-QQ-lVOY-iZ#O-i#O#P.R#P#Q,Y#Q;'S-i;'S;=`.b<%lO-iQ.USOY-iZ;'S-i;'S;=`.b<%lO-iQ.eP;=`<%l-iQ.kSOY,YZ;'S,Y;'S;=`.w<%lO,YQ.zP;=`<%l,YU/SWqSOt#ruw#rx!P#r!P!Q/l!Q#O#r#P;'S#r;'S;=`$Z<%lO#rU/sbqSuQOt#ruw#rx#O#r#P#Z#r#Z#[/l#[#]#r#]#^/l#^#a#r#a#b/l#b#g#r#g#h/l#h#i#r#i#j/l#j#m#r#m#n/l#n;'S#r;'S;=`$Z<%lO#rU1Q[qSOY0{YZ#rZt0{tu-iuw0{wx-ix#O0{#O#P.R#P#Q+V#Q;'S0{;'S;=`1v<%lO0{U1yP;=`<%l0{U2PP;=`<%l+VU2ZUqSnQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#r~2rO!p~U2yUqSwQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU3bYqSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#o3]#o;'S#r;'S;=`$Z<%lO#rU4XUyQqSOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU4pZqSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#U5c#U#o3]#o;'S#r;'S;=`$Z<%lO#rU5h[qSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#`3]#`#a6^#a#o3]#o;'S#r;'S;=`$Z<%lO#rU6c[qSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#g3]#g#h7X#h#o3]#o;'S#r;'S;=`$Z<%lO#rU7^[qSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#X3]#X#Y8S#Y#o3]#o;'S#r;'S;=`$Z<%lO#rU8ZYtQqSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#o3]#o;'S#r;'S;=`$Z<%lO#r^9QY!qWqSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#o3]#o;'S#r;'S;=`$Z<%lO#r^9wY!sWqSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#o3]#o;'S#r;'S;=`$Z<%lO#r^:n[!rWqSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#f3]#f#g;d#g#o3]#o;'S#r;'S;=`$Z<%lO#rU;i[qSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#i3]#i#j7X#j#o3]#o;'S#r;'S;=`$Z<%lO#rU<fUzQqSOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#r~<}O!v~",
|
||||||
tokenizers: [operatorTokenizer, 1, 2, 3, tokenizer, new LocalTokenGroup("[~RP!O!PU~ZO!c~~", 11)],
|
tokenizers: [operatorTokenizer, 1, 2, 3, tokenizer, new LocalTokenGroup("[~RP!O!PU~ZO!c~~", 11)],
|
||||||
topRules: {"Program":[0,17]},
|
topRules: {"Program":[0,18]},
|
||||||
specialized: [{term: 13, get: (value: keyof typeof spec_Identifier) => spec_Identifier[value] || -1}],
|
specialized: [{term: 13, get: (value: any, stack: any) => (specializeKeyword(value, stack) << 1), external: specializeKeyword},{term: 13, get: (value: keyof typeof spec_Identifier) => spec_Identifier[value] || -1}],
|
||||||
tokenPrec: 756
|
tokenPrec: 759
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -299,10 +299,10 @@ describe('Assign', () => {
|
||||||
AssignableIdentifier add
|
AssignableIdentifier add
|
||||||
Eq =
|
Eq =
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
AssignableIdentifier a
|
Identifier a
|
||||||
AssignableIdentifier b
|
Identifier b
|
||||||
colon :
|
colon :
|
||||||
BinOp
|
BinOp
|
||||||
Identifier a
|
Identifier a
|
||||||
|
|
|
||||||
|
|
@ -30,9 +30,9 @@ describe('DotGet', () => {
|
||||||
test('function parameters are in scope within function body', () => {
|
test('function parameters are in scope within function body', () => {
|
||||||
expect('do config: config.path end').toMatchTree(`
|
expect('do config: config.path end').toMatchTree(`
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
AssignableIdentifier config
|
Identifier config
|
||||||
colon :
|
colon :
|
||||||
FunctionCallOrIdentifier
|
FunctionCallOrIdentifier
|
||||||
DotGet
|
DotGet
|
||||||
|
|
@ -45,9 +45,9 @@ describe('DotGet', () => {
|
||||||
test('parameters out of scope outside function', () => {
|
test('parameters out of scope outside function', () => {
|
||||||
expect('do x: x.prop end; x.prop').toMatchTree(`
|
expect('do x: x.prop end; x.prop').toMatchTree(`
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
AssignableIdentifier x
|
Identifier x
|
||||||
colon :
|
colon :
|
||||||
FunctionCallOrIdentifier
|
FunctionCallOrIdentifier
|
||||||
DotGet
|
DotGet
|
||||||
|
|
@ -64,10 +64,10 @@ describe('DotGet', () => {
|
||||||
y.bar
|
y.bar
|
||||||
end`).toMatchTree(`
|
end`).toMatchTree(`
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
AssignableIdentifier x
|
Identifier x
|
||||||
AssignableIdentifier y
|
Identifier y
|
||||||
colon :
|
colon :
|
||||||
FunctionCallOrIdentifier
|
FunctionCallOrIdentifier
|
||||||
DotGet
|
DotGet
|
||||||
|
|
@ -87,18 +87,18 @@ end`).toMatchTree(`
|
||||||
do y: y.inner end
|
do y: y.inner end
|
||||||
end`).toMatchTree(`
|
end`).toMatchTree(`
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
AssignableIdentifier x
|
Identifier x
|
||||||
colon :
|
colon :
|
||||||
FunctionCallOrIdentifier
|
FunctionCallOrIdentifier
|
||||||
DotGet
|
DotGet
|
||||||
IdentifierBeforeDot x
|
IdentifierBeforeDot x
|
||||||
Identifier outer
|
Identifier outer
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
AssignableIdentifier y
|
Identifier y
|
||||||
colon :
|
colon :
|
||||||
FunctionCallOrIdentifier
|
FunctionCallOrIdentifier
|
||||||
DotGet
|
DotGet
|
||||||
|
|
@ -208,4 +208,70 @@ end`).toMatchTree(`
|
||||||
PositionalArg
|
PositionalArg
|
||||||
Identifier prop`)
|
Identifier prop`)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('readme.1 is Word when readme not in scope', () => {
|
||||||
|
expect('readme.1').toMatchTree(`Word readme.1`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('readme.1 is Word when used in function', () => {
|
||||||
|
expect('echo readme.1').toMatchTree(`
|
||||||
|
FunctionCall
|
||||||
|
Identifier echo
|
||||||
|
PositionalArg
|
||||||
|
Word readme.1`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('obj.1 is DotGet when obj is assigned', () => {
|
||||||
|
expect('obj = 5; obj.1').toMatchTree(`
|
||||||
|
Assign
|
||||||
|
AssignableIdentifier obj
|
||||||
|
Eq =
|
||||||
|
Number 5
|
||||||
|
FunctionCallOrIdentifier
|
||||||
|
DotGet
|
||||||
|
IdentifierBeforeDot obj
|
||||||
|
Number 1
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('obj.1 arg is DotGet when obj is assigned', () => {
|
||||||
|
expect('obj = 5; obj.1').toMatchTree(`
|
||||||
|
Assign
|
||||||
|
AssignableIdentifier obj
|
||||||
|
Eq =
|
||||||
|
Number 5
|
||||||
|
FunctionCallOrIdentifier
|
||||||
|
DotGet
|
||||||
|
IdentifierBeforeDot obj
|
||||||
|
Number 1
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('dot get index works as function w/ args', () => {
|
||||||
|
expect(`io = list (do x: echo x end); io.0 heya`).toMatchTree(`
|
||||||
|
Assign
|
||||||
|
AssignableIdentifier io
|
||||||
|
Eq =
|
||||||
|
FunctionCall
|
||||||
|
Identifier list
|
||||||
|
PositionalArg
|
||||||
|
ParenExpr
|
||||||
|
FunctionDef
|
||||||
|
Do do
|
||||||
|
Params
|
||||||
|
Identifier x
|
||||||
|
colon :
|
||||||
|
FunctionCall
|
||||||
|
Identifier echo
|
||||||
|
PositionalArg
|
||||||
|
Identifier x
|
||||||
|
keyword end
|
||||||
|
FunctionCall
|
||||||
|
DotGet
|
||||||
|
IdentifierBeforeDot io
|
||||||
|
Number 0
|
||||||
|
PositionalArg
|
||||||
|
Identifier heya
|
||||||
|
`)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ describe('Do', () => {
|
||||||
test('parses function no parameters', () => {
|
test('parses function no parameters', () => {
|
||||||
expect('do: 1 end').toMatchTree(`
|
expect('do: 1 end').toMatchTree(`
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
colon :
|
colon :
|
||||||
Number 1
|
Number 1
|
||||||
|
|
@ -70,9 +70,9 @@ describe('Do', () => {
|
||||||
test('parses function with single parameter', () => {
|
test('parses function with single parameter', () => {
|
||||||
expect('do x: x + 1 end').toMatchTree(`
|
expect('do x: x + 1 end').toMatchTree(`
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
AssignableIdentifier x
|
Identifier x
|
||||||
colon :
|
colon :
|
||||||
BinOp
|
BinOp
|
||||||
Identifier x
|
Identifier x
|
||||||
|
|
@ -84,10 +84,10 @@ describe('Do', () => {
|
||||||
test('parses function with multiple parameters', () => {
|
test('parses function with multiple parameters', () => {
|
||||||
expect('do x y: x * y end').toMatchTree(`
|
expect('do x y: x * y end').toMatchTree(`
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
AssignableIdentifier x
|
Identifier x
|
||||||
AssignableIdentifier y
|
Identifier y
|
||||||
colon :
|
colon :
|
||||||
BinOp
|
BinOp
|
||||||
Identifier x
|
Identifier x
|
||||||
|
|
@ -102,10 +102,10 @@ describe('Do', () => {
|
||||||
x + 9
|
x + 9
|
||||||
end`).toMatchTree(`
|
end`).toMatchTree(`
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
AssignableIdentifier x
|
Identifier x
|
||||||
AssignableIdentifier y
|
Identifier y
|
||||||
colon :
|
colon :
|
||||||
BinOp
|
BinOp
|
||||||
Identifier x
|
Identifier x
|
||||||
|
|
@ -124,9 +124,9 @@ end`).toMatchTree(`
|
||||||
AssignableIdentifier fnnn
|
AssignableIdentifier fnnn
|
||||||
Eq =
|
Eq =
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
AssignableIdentifier x
|
Identifier x
|
||||||
colon :
|
colon :
|
||||||
FunctionCallOrIdentifier
|
FunctionCallOrIdentifier
|
||||||
Identifier x
|
Identifier x
|
||||||
|
|
@ -139,9 +139,9 @@ end`).toMatchTree(`
|
||||||
AssignableIdentifier enddd
|
AssignableIdentifier enddd
|
||||||
Eq =
|
Eq =
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
AssignableIdentifier x
|
Identifier x
|
||||||
colon :
|
colon :
|
||||||
FunctionCallOrIdentifier
|
FunctionCallOrIdentifier
|
||||||
Identifier x
|
Identifier x
|
||||||
|
|
|
||||||
|
|
@ -24,10 +24,10 @@ describe('multiline', () => {
|
||||||
AssignableIdentifier add
|
AssignableIdentifier add
|
||||||
Eq =
|
Eq =
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
AssignableIdentifier a
|
Identifier a
|
||||||
AssignableIdentifier b
|
Identifier b
|
||||||
colon :
|
colon :
|
||||||
Assign
|
Assign
|
||||||
AssignableIdentifier result
|
AssignableIdentifier result
|
||||||
|
|
@ -61,10 +61,10 @@ end
|
||||||
Number 3
|
Number 3
|
||||||
|
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
AssignableIdentifier x
|
Identifier x
|
||||||
AssignableIdentifier y
|
Identifier y
|
||||||
colon :
|
colon :
|
||||||
FunctionCallOrIdentifier
|
FunctionCallOrIdentifier
|
||||||
Identifier x
|
Identifier x
|
||||||
|
|
|
||||||
|
|
@ -75,13 +75,27 @@ describe('pipe expressions', () => {
|
||||||
Identifier each
|
Identifier each
|
||||||
PositionalArg
|
PositionalArg
|
||||||
FunctionDef
|
FunctionDef
|
||||||
keyword do
|
Do do
|
||||||
Params
|
Params
|
||||||
AssignableIdentifier x
|
Identifier x
|
||||||
colon :
|
colon :
|
||||||
FunctionCallOrIdentifier
|
FunctionCallOrIdentifier
|
||||||
Identifier x
|
Identifier x
|
||||||
keyword end
|
keyword end
|
||||||
`)
|
`)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test(`double trouble (do keyword isn't over eager)`, () => {
|
||||||
|
expect(`
|
||||||
|
double 2 | double`).toMatchTree(`
|
||||||
|
PipeExpr
|
||||||
|
FunctionCall
|
||||||
|
Identifier double
|
||||||
|
PositionalArg
|
||||||
|
Number 2
|
||||||
|
operator |
|
||||||
|
FunctionCallOrIdentifier
|
||||||
|
Identifier double
|
||||||
|
`)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,10 @@
|
||||||
import { ExternalTokenizer, InputStream, Stack } from '@lezer/lr'
|
import { ExternalTokenizer, InputStream, Stack } from '@lezer/lr'
|
||||||
import { Identifier, AssignableIdentifier, Word, IdentifierBeforeDot } from './shrimp.terms'
|
import { Identifier, AssignableIdentifier, Word, IdentifierBeforeDot, Do } from './shrimp.terms'
|
||||||
|
|
||||||
|
// doobie doobie do (we need the `do` keyword to know when we're defining params)
|
||||||
|
export function specializeKeyword(ident: string) {
|
||||||
|
return ident === 'do' ? Do : -1
|
||||||
|
}
|
||||||
|
|
||||||
// The only chars that can't be words are whitespace, apostrophes, closing parens, and EOF.
|
// The only chars that can't be words are whitespace, apostrophes, closing parens, and EOF.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user