Ejemplo n.º 1
0
        public object Translate(ASTNode node)
        {
            //TODO: Проработать вопрос удаления слов, избавиться от лишних скобок
            //Домен = Слово '{ Значения '} | Слово '= '{ Значения '} | Слово ;
            //Значения = Домен ', Значения |'{ Операция '} ', Значения | Домен | '{ Операция '} | '{ '} ;
            //Операция = ЛевыйОперанд '-< ЦентральныйОперанд '>- ПравыйОперанд |
            //  ЛевыйОперанд БинарнаяОперация ПравыйОперанд |
            //  ЛевыйОперанд УнарнаяОперация
            // ;
            //ЛевыйОперанд = '|> Значения ;
            //ПравыйОперанд = Значения ;
            //ЦентральныйОперанд = Значения ;
            //БинарнаяОперация = '<- | '-> | '+ | '- | '* | '~ | '^;
            //УнарнаяОперация = '>: | '<: | '< УнарнаяОперация | '> УнарнаяОперация | '< | '> ;
            //Слово = '[ ЭлементыСлова ']  | Символ | '_ ;
            //ЭлементыСлова = Слово ', ЭлементыСлова | Слово ;
            //Символ = Буква Символ | Цифра Символ | Буква | Цифра ;
            //Буква = 'a|'b|'c|'d|'элементы|'f|'g|'h|'i|'j|'k|'l|'m|'n|'o|'p|'q|'r|'s|'t|'u|'v|'w|'x|'y|'z|
            //'A|'B|'C|'D|'E|'F|'G|'H|'I|'J|'K|'L|'M|'N|'O|'P|'Q|'R|'S|'T|'U|'V|'W|'X|'Y|'Z|
            //'а|'б|'в|'г|'д|'е|'ё|'ж|'з|'и|'й|'к|'л|'м|'н|'о|'п|'р|'с|'т|'у|'ф|'х|'ц|'ч|'ш|'щ|'ь|'ы|'ъ|'э|'ю|'я|
            //'А|'Б|'В|'Г|'Д|'Е|'Ё|'Ж|'З|'И|'Й|'К|'Л|'М|'Н|'О|'П|'Р|'С|'Т|'У|'Ф|'Х|'Ц|'Ч|'Ш|'Ь|'Щ|'Ъ|'Ы|'Э|'Ю|'Я|
            //'_;
            //Цифра = '0|'1|'2|'3|'4|'5|'6|'7|'8|'9 ;
            Error = 0;
            if (!node.IsMatch(Grammar) && node.Type == ASTType.NonterminalEqual)
            {
                throw new Exception("Ошибка трансляции: правило " + node.RuleName + " = " + node.RuleTerm + " не соответствует грамматике");
            }
            switch (node.RuleName)
            {
            case "Домен": return(ToDomain(node));

            case "Значения": return(ToValues(node));

            case "Операция": return(ToOperation(node));

            case "ЛевыйОперанд": return(ToLeftOperand(node));

            case "ПравыйОперанд": return(ToRightOperand(node));

            case "ЦентральныйОперанд": return(ToCentralOperand(node));

            case "БинарнаяОперация": return(ToBinaryOperation(node));

            case "УнарнаяОперация": return(ToUnaryOperation(node));

            case "Слово": return(ToWord(node));

            case "ЭлементыСлова": return(ToWordElements(node));

            case "Символ": return(ToSymbol(node));

            case "Буква": return(ToLetter(node));

            case "Цифра": return(ToDigit(node));

            case "'{": return("{");

            case "'}": return("}");

            case "',": return(null);

            case "']": return(null);

            case "'[": return(null);

            case "'<": return("<");

            case "'<:": return("<:");

            case "'>": return(">");

            case "'>:": return(">:");

            case "'<-": return("<-");

            case "'->": return("->");

            case "'+": return("+");

            case "'-": return("-");

            case "'*": return("*");

            case "'~": return("~");

            case "'^": return("^");

            case "'_": return("_");

            default:
            {
                Error = 256;            //Неизвестный токен
                throw new ArgumentException("Неизвестныое правило: " + node.RuleName);
            }
            }
        }
Ejemplo n.º 2
0
        public object Translate(ASTNode node)
        {
            ///

            //TODO: Добавить управление вычислением: останов вычислений, включение/исключение из результата
            //
            //Категория = '{ Стрелки '} ;
            //Стрелка = Область Слово Кообласть | Слово Кообласть | Область Слово | Слово ;
            //Стрелки = Стрелка ', Стрелки | Стрелка ;
            //Область = Ноль | '{ Стрелки '} ;
            //Кообласть = Ноль | '{ Стрелки '} ;
            //Слова = Слово ', Слова | Слово ;
            //Слово = '[ Слова '] | Символы ;
            //Символы = Символ Символы | Символ ;
            //Символ = Буква | Цифра | Знак ;
            //Буква = 'a|'b|'c|'d|'e|'f|'g|'h|'i|'j|'k|'l|'m|'n|'o|'p|'q|'r|'s|'t|'u|'v|'w|'x|'y|'z|'A|'B|'C|'D|'E|'F|'G|'H|'I|'J|'K|'L|'M|'N|'O|'P|'Q|'R|'S|'T|'U|'V|'W|'X|'Y|'Z|
            //'а|'б|'в|'г|'д|'е|'ё|'ж|'з|'и|'й|'к|'л|'м|'н|'о|'п|'р|'с|'т|'у|'ф|'х|'ц|'ч|'ш|'щ|'ь|'ы|'ъ|'э|'ю|'я|'А|'Б|'В|'Г|'Д|'Е|'Ё|'Ж|'З|'И|'Й|'К|'Л|'М|'Н|'О|'П|'Р|'С|'Т|'У|'Ф|'Х|'Ц|'Ч|'Ш|'Ь|'Щ|'Ъ|'Ы|'Э|'Ю|'Я ;
            //Цифра = '0|'1|'2|'3|'4|'5|'6|'7|'8|'9 ;
            //Знак = '< | '> | '* | '+ | '- | '~: | '~ | 'id | '_ | '>: | '<: ;
            //Ноль = '{ '} ;
            Error = 0;
            if (!node.IsMatch(Grammar) && node.Type == ASTType.NonterminalEqual)
            {
                throw new Exception("Ошибка трансляции: правило " + node.RuleName + " = " + node.RuleTerm + " не соответствует грамматике");
            }
            switch (node.RuleName)
            {
            case "Категория": return(Категория(node));

            case "Стрелка": return(Стрелка(node));

            case "Стрелки": return(Стрелки(node));

            case "Область": return(Область(node));

            case "Кообласть": return(Кообласть(node));

            case "Слова": return(Слова(node));

            //case "Функтор": return Функтор(node);
            case "Слово": return(Слово(node));

            case "Символы": return(Символы(node));

            case "Символ": return(Символ(node));

            case "Буква": return(Буква(node));

            case "Цифра": return(Цифра(node));

            case "Знак": return(Знак(node));

            case "Ноль": return(Ноль(node));

            case "'{": return("{");

            case "'}": return("}");

            case "',": return(null);

            case "']": return(null);

            case "'[": return(null);

            case "'<": return("<");

            case "'<:": return("<:");

            case "'>": return(">");

            case "'>:": return(">:");

            case "'<-": return("<-");

            case "'->": return("->");

            case "'+": return("+");

            case "'-": return("-");

            case "'*": return("*");

            case "'~": return("~");

            case "'~:": return("~:");

            case "'^": return("^");

            case "'id": return("id");

            case "'_": return("_");

            default:
            {
                Error = 256;
                throw new ArgumentException("Неизвестныое правило: " + node.RuleName);
            }
            }
        }