Source: syntax-rule.js

"use strict";
const LexElement = require("./lex-element.js");
/**
 * Rule for a language syntax.
 * @class
 */
class SyntaxRule {
    /**
     * @constructor
     * @typedef {Array<string|LexElement>} Rule
     * @typedef {function(Term):any} Evaluator
     * @param {string} name syntax name
     * @param {Rule[]} rules syntax rules
     * @param {Evaluator|null} evaluator evaluator function
     */
    constructor(name, rules, evaluator) {
        for(const elements of rules) {
            for(const element of elements) {
                if(typeof element !== "string" && !(element instanceof LexElement)) {
                    throw new Error(`Type of elements in syntax rules should be string or LexElement`)
                }
            }
        }
        /**
         * Rule name.
         * @type {string}
         */
        this.name = name;
        /**
         * Rules to represent this rule.
         * @type {Rule[]}
         */
        this.rules = rules;
        /**
         * A function to evaluate the result of parsing.
         * @type {Evaluator}
         */
        this.evaluator = evaluator;
    }
}
module.exports = SyntaxRule;