30 lines
799 B
TypeScript
30 lines
799 B
TypeScript
import { Parser } from '../parse'
|
|
import { Token } from '../../tokenizer/token'
|
|
import { IPrefixParselet } from './prefix'
|
|
import { IExpression } from '../expression'
|
|
import { LoopExpression } from '../expressions/loop'
|
|
|
|
export class LoopParselet implements IPrefixParselet {
|
|
constructor(public precedence = 0) {}
|
|
|
|
parse(parser: Parser, token: Token) {
|
|
parser.consume('LEFT_PARENT')
|
|
const args: IExpression[] = []
|
|
|
|
if (parser.match('RIGHT_PARENT'))
|
|
throw new Error(`loop() called without arguments`)
|
|
|
|
do {
|
|
args.push(parser.parseExpression())
|
|
} while (parser.match('COMMA'))
|
|
parser.consume('RIGHT_PARENT')
|
|
|
|
if (args.length !== 2)
|
|
throw new Error(
|
|
`There must be exactly two loop() arguments; found ${args.length}`
|
|
)
|
|
|
|
return new LoopExpression(args[0], args[1])
|
|
}
|
|
}
|