Функция parse

Материал из Compilers Wiki
Версия от 15:20, 6 апреля 2018; Admin (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Функция parse(FILE *f, char *path, void data(Dat *), void func(Fn *)) - функция, реализованная в Си интерфейсе QBE. Располагается в файле parse.c и "подключается" в all.h.

Аргументы функции

  • FILE *f - хендл файла, откуда происходит чтение программы.
  • char *path - путь к этому файлу (используется только для сообщений об ошибках, так что неважен).
  • void data(Dat *) - функция, вызываемая для каждого распарсенного куска данных.
  • void func(Fn *) - функция, вызываемая для каждой распарсенной функции.

Назначение

parse осуществляет парсинг QBE файла во внутреннее представление, с которым происходит взаимодействие внутри некоторой функции (внутри крутится вечный цикл со свитчами, которые еще что-то парсят). В примере считывание происходит, очевидно с stdin, работать с внутренним представлением функции предлагают в func, data не используется.

Исходный код

Функция parse из parse.c

void parse(FILE *f, char *path, void data(Dat *), void func(Fn *))
{
	int t, export;

	lexinit();
	inf = f;
	inpath = path;
	lnum = 1;
	thead = Txxx;
	ntyp = 0;
	typ = vnew(0, sizeof typ[0], Pheap);
	for (;;) {
		export = 0;
		switch (nextnl()) {
		default:
			err("top-level definition expected");
		case Texport:
			export = 1;
			t = nextnl();
			if (t == Tfunc) {
		case Tfunc:
				func(parsefn(export));
				break;
			}
			else if (t == Tdata) {
		case Tdata:
				parsedat(data, export);
				break;
			}
			else
				err("export can only qualify data and function");
		case Ttype:
			parsetyp();
			break;
		case Teof:
			vfree(typ);
			return;
		}
	}
}