Функция parse — различия между версиями
Admin (обсуждение | вклад) |
Admin (обсуждение | вклад) |
||
| Строка 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;
}
}
}