ms/packages/molang/src/parser/parselets/name.ts

44 lines
1.1 KiB
TypeScript
Raw Normal View History

import { IPrefixParselet } from './prefix'
import { Token } from '../../tokenizer/token'
import { Parser } from '../parse'
import { NameExpression } from '../expressions/name'
import { ContextSwitchExpression } from '../expressions/contextSwitch'
export class NameParselet implements IPrefixParselet {
constructor(public precedence = 0) {}
parse(parser: Parser, token: Token) {
const nameExpr = new NameExpression(
parser.executionEnv,
token.getText()
)
const nextTokens = <const>[parser.lookAhead(0), parser.lookAhead(1)]
// Context switching operator "->"
if (
nextTokens[0].getType() === 'MINUS' &&
nextTokens[1].getType() === 'GREATER'
) {
parser.consume('MINUS')
parser.consume('GREATER')
const nameToken = parser.lookAhead(0)
if (nameToken.getType() !== 'NAME')
throw new Error(
`Cannot use context switch operator "->" on ${parser.lookAhead(
0
)}`
)
parser.consume('NAME')
return new ContextSwitchExpression(
nameExpr,
new NameExpression(parser.executionEnv, nameToken.getText())
)
}
return nameExpr
}
}