|
Программирование >> Формирование пользовательского контейнера
if(!fin) { cout Cannot open argv[l] endl; return 1; £out.open(argv[2]); i£(!fout) { cout Ccinnot open argv[21 endl; return 1; Записывает заголовок. fout Translated from an .exp source file.\n 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 != \ ) ; fout token; else if (token == foreach ) foreachO; 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.geterrorO endl; return 1; return 0; Получает следукяцую лексел/ч/ из входного потока, bool gettoken(string &tok) { char ch; char ch2; static bool tracklndent = true; tok = ; ch = fin.get О; Ищет EOF и возвращает false, если EOF найден рниеС+-ь 759 j£(!fin) return false; Читает пробелы, if (isspace(ch)) { while(isspace(ch)) { tok += ch; Переустанавливает счетчик отступа (indent counter) для каждой новой строки. if(ch == -Чп) { indent = ; tracklndent = true; else if(tracklndent) indent += ch; ch = fin.getO ; fin.putback(ch); return true; Перестает отслеживать отступ, обнаружив первый отличный от пробела символ в строке. tracklndent = false; Считывает идентификатор или ключевое слово. if(isaipha(ch) ch== ) { While(isalpha(ch) isdigit(ch) ch== ) { tok f= ch; ch = fin.getO ; fin.putback(ch); return true; Считывает число. i(isdigit(ch)) { ile(isdigit(ch) ch==.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.004
При копировании материалов приветствуются ссылки. |