Source: Parser.js

import { ParsingError } from "./Errors.js"
import {
	VariableDeclarationGenerator,
	IfStatementGenerator,
	ConsoleStatementGenerator,
	RepeatStatementGenerator,
	FunctionDeclarationGenerator,
	CallExpressionGenerator
} from "./Generators.js"

/**
 * @class
 */
export class Parser {
	/**
	 * Parses each line separately
	 * @param {string} input
	 */
	static parseLine(input) {
		const line = input.trim()

		if (RX_COMMENT.test(line) || line.trim() === "") return ""
		else if (RX_VARIABLE_DECLARATION.test(line))
			return VariableDeclarationGenerator.generate(line)
		else if (RX_IF_STATEMENT.test(line))
			return IfStatementGenerator.generate(line)
		else if (RX_REPEAT_STATEMENT.test(line))
			return RepeatStatementGenerator.generate(line)
		else if (RX_CONSOLE_STATEMENT.test(line))
			return ConsoleStatementGenerator.generate(line)
		else if (RX_FUNCTION_DECLARATION.test(line))
			return FunctionDeclarationGenerator.generate(line)
		else if (RX_CALL_EXPRESSION.test(line))
			return CallExpressionGenerator.generate(line)
		else throw new ParsingError(Nabd0006, line)
	}

	/**
	 * Parses whole program using parseLine
	 * @param {string} input
	 */
	static parse(input) {
		const program = input.replace(/ +/g, ' ').trim().split('\n')
		const nodes = []

		program.forEach((line, index) => {
			const parsed = Parser.parseLine(line)

			if (parsed !== "") nodes.push(parsed)
		})

		return nodes
	}
}