Программирование >>  Формирование пользовательского контейнера 

1 ... 48 49 50 [ 51 ] 52 53 54 ... 156


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==.



1 ... 48 49 50 [ 51 ] 52 53 54 ... 156

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.004
При копировании материалов приветствуются ссылки.
Яндекс.Метрика