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); } } }
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); } } }