Функция parse — различия между версиями

Материал из Compilers Wiki
Перейти к: навигация, поиск
 
Строка 1: Строка 1:
 
Функция <strong>parse(FILE *f, char *path, void data(Dat *), void func(Fn *))</strong> - функция, реализованная в [[ Си-интерфейс | Си интерфейсе]] [[QBE]]. Располагается в файле <code>parse.c</code> и "подключается" в <code>[[ Си-интерфейс | all.h]]</code>.
 
Функция <strong>parse(FILE *f, char *path, void data(Dat *), void func(Fn *))</strong> - функция, реализованная в [[ Си-интерфейс | Си интерфейсе]] [[QBE]]. Располагается в файле <code>parse.c</code> и "подключается" в <code>[[ Си-интерфейс | all.h]]</code>.
 +
 +
== Аргументы функции ==
 +
 +
*<code>FILE *f</code> - хендл файла, откуда происходит чтение программы.
 +
*<code>char *path</code> - путь к этому файлу (используется только для сообщений об ошибках, так что неважен).
 +
*<code>void data(Dat *)</code> - функция, вызываемая для каждого распарсенного куска данных.
 +
*<code>void func(Fn *)</code> - функция, вызываемая для каждой распарсенной функции.
  
 
== Назначение ==
 
== Назначение ==

Текущая версия на 15:20, 6 апреля 2018

Функция 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;
		}
	}
}