예제 #1
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);
            }
            }
        }
예제 #2
0
 private object Ноль(ASTNode node)
 {
     //Ноль = '{ '} ;
     return(new List <Конус>());
 }
예제 #3
0
 private object Знак(ASTNode node)
 {
     //Знак = '< | '> | '* | '+ | '- | '~ | '~:'| 'id | '_ | '>:;
     return(node.Childs.First().Value.Text.Value);
 }
예제 #4
0
 private object Цифра(ASTNode node)
 {
     //Цифра = '0|'1|'2|'3|'4|'5|'6|'7|'8|'9 ;
     return(node.Childs.First().Value.Text.Value);
 }
예제 #5
0
 private object Буква(ASTNode node)
 {
     //Буква = '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|
     //        'а|'б|'в|'г|'д|'е|'ё|'ж|'з|'и|'й|'к|'л|'м|'н|'о|'п|'р|'с|'т|'у|'ф|'х|'ц|'ч|'ш|'щ|'ь|'ы|'ъ|'э|'ю|'я|'А|'Б|'В|'Г|'Д|'Е|'Ё|'Ж|'З|'И|'Й|'К|'Л|'М|'Н|'О|'П|'Р|'С|'Т|'У|'Ф|'Х|'Ц|'Ч|'Ш|'Ь|'Щ|'Ъ|'Ы|'Э|'Ю|'Я|'_ ;
     return(node.Childs.First().Value.Text.Value);
 }
예제 #6
0
 private object Символ(ASTNode node)
 {
     //Символ = Буква | Цифра | Знак ;
     return(Translate(node.Childs.First().Value) as string);
 }