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); } } }
private object Ноль(ASTNode node) { //Ноль = '{ '} ; return(new List <Конус>()); }
private object Знак(ASTNode node) { //Знак = '< | '> | '* | '+ | '- | '~ | '~:'| 'id | '_ | '>:; return(node.Childs.First().Value.Text.Value); }
private object Цифра(ASTNode node) { //Цифра = '0|'1|'2|'3|'4|'5|'6|'7|'8|'9 ; return(node.Childs.First().Value.Text.Value); }
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); }
private object Символ(ASTNode node) { //Символ = Буква | Цифра | Знак ; return(Translate(node.Childs.First().Value) as string); }