/*
 * SDK Pullenti Lingvo, version 4.33, fabruary 2026. Copyright (c) 2013-2026, Pullenti. All rights reserved. 
 * Non-Commercial Freeware and Commercial Software.
 * This class is generated using the converter Unisharping (www.unisharping.ru) from Pullenti C#.NET project. 
 * The latest version of the code is available on the site www.pullenti.ru
 */


const NounPhraseParseAttr = require("./../../ner/core/NounPhraseParseAttr");
const MetaToken = require("./../../ner/MetaToken");
const TerminParseAttr = require("./../../ner/core/TerminParseAttr");
const Termin = require("./../../ner/core/Termin");
const DelimType = require("./DelimType");
const TextToken = require("./../../ner/TextToken");
const NounPhraseHelper = require("./../../ner/core/NounPhraseHelper");
const TerminCollection = require("./../../ner/core/TerminCollection");

class DelimToken extends MetaToken {
    
    constructor(b, e) {
        super(b, e, null);
        this.typ = DelimType.UNDEFINED;
        this.doublt = false;
    }
    
    toString() {
        return (String(this.typ) + (this.doublt ? "?" : "") + ": " + super.toString());
    }
    
    static tryParse(t) {
        if (!(t instanceof TextToken)) 
            return null;
        if (t.isCommaAnd) {
            let res0 = DelimToken.tryParse(t.next);
            if (res0 !== null) {
                res0.beginToken = t;
                return res0;
            }
            return null;
        }
        let tok = DelimToken.m_Onto.tryParse(t, TerminParseAttr.NO);
        if (tok !== null) {
            if (t.isValue("ХОТЕТЬ", null) && (t instanceof TextToken)) {
                if (t.term !== "ХОТЯ") 
                    return null;
            }
            let res = new DelimToken(t, tok.endToken);
            res.typ = DelimType.of(tok.termin.tag);
            res.doublt = tok.termin.tag2 !== null;
            let res2 = DelimToken.tryParse(res.endToken.next);
            if (res2 !== null) {
                if (res2.typ === res.typ) {
                    res.endToken = res2.endToken;
                    res.doublt = false;
                }
            }
            if (t.morph._class.isPronoun) {
                let npt = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.PARSEADVERBS, 0, null);
                if (npt !== null && npt.endChar > res.endChar) 
                    return null;
            }
            return res;
        }
        return null;
    }
    
    static initialize() {
        DelimToken.m_Onto = new TerminCollection();
        let t = null;
        t = Termin._new96("НО", DelimType.BUT);
        t.addVariant("А", false);
        t.addVariant("ОДНАКО", false);
        t.addVariant("ХОТЯ", false);
        DelimToken.m_Onto.add(t);
        t = Termin._new96("ЕСЛИ", DelimType.IF);
        t.addVariant("В СЛУЧАЕ ЕСЛИ", false);
        DelimToken.m_Onto.add(t);
        t = Termin._new98("КОГДА", DelimType.IF, DelimToken.m_Onto);
        DelimToken.m_Onto.add(t);
        t = Termin._new96("ТО", DelimType.THEN);
        t.addVariant("ТОГДА", false);
        DelimToken.m_Onto.add(t);
        t = Termin._new96("ИНАЧЕ", DelimType.ELSE);
        t.addVariant("В ПРОТИВНОМ СЛУЧАЕ", false);
        DelimToken.m_Onto.add(t);
        t = Termin._new96("ТАК КАК", DelimType.BECAUSE);
        t.addVariant("ПОТОМУ ЧТО", false);
        t.addVariant("ПО ПРИЧИНЕ ТОГО ЧТО", false);
        t.addVariant("ИЗ ЗА ТОГО ЧТО", false);
        t.addVariant("ИЗЗА ТОГО ЧТО", false);
        t.addVariant("ИЗ-ЗА ТОГО ЧТО", false);
        t.addVariant("ТО ЕСТЬ", false);
        DelimToken.m_Onto.add(t);
        t = Termin._new96("ЧТОБЫ", DelimType.FOR);
        t.addVariant("ДЛЯ ТОГО ЧТОБЫ", false);
        DelimToken.m_Onto.add(t);
        t = Termin._new96("ЧТО", DelimType.WHAT);
        DelimToken.m_Onto.add(t);
    }
    
    static static_constructor() {
        DelimToken.m_Onto = null;
    }
}


DelimToken.static_constructor();

module.exports = DelimToken