Функции main о — две обязанности. Во-первых, она открывает входной и Выходной файлы, заданные в командной строке. Код, предназначенный для этого, хорошо знаком всем программистам на языке С++. Во-вторых, в ней выполняется главный цикл трансляции, в котором преобразуются экспериментальные конструкции. Далее приведен главный цикл трансляции. try { // Главный цикл трансляции, while(gettoken(token)) ( // Пропускает комментарии //. if(token == "//") { do { fout « token; gettoken(token); } while(token.find('\n') == string::npos); fout « token; } // Пропускает комментарии /*. else if(token =="/*-) { do { fout « token; gettoken(token); } while(token != "*/"); fout « token; } // Пропускает строку в кавычках, else if(token == "\"") { do { fout « token; gettoken(token); } while(token != "\n") ; fout « token; } else if(token == "foreach") foreach() ; else if(token == "cases") cases(); else if(token == "repeat") repeat(); • else if (token == "until") until(); else if (token == "typeof") typeof(); else fout « token; } ) catch (SyntaxExc exc) { cout « exc.geterror() « endl; return 1; } В каждом проходе главного цикла читается очередная лексема из входного файла. Если она не требует трансляции, то записывается в выходной файл. Если же лексема содержит одно из экспериментальных ключевых слов, вызывается соответствующая функция для трансляции его в эквивалентный код на языке С++. Обратите внимание на то, что в цикле пропускаются комментарии и строки в кавычках, т. е. они копируются в выходной файл без предварительного поиска в них экспериментальных ключевых слов. Если обнаруживается синтаксическая ошибка в процессе трансляции проверяемого ключевого слова, кодом, выполняющим трансляцию, генерируется объект-исключение типа SyntaxExc и передается вызываемому в функции main о обработчику исключений catch, который просто отображает ошибку на экране. Вы можете усовершенствовать сообщение об ошибке, включив в него номер ошибочной строки или другую интересующую вас информацию.
|