Где я могу узнать алгоритм включения препроцессора?

Я пишу препроцессор PHP для C в качестве эксперимента, и я хочу создать нотацию включения вроде:

//? include("myfile.h");

Я изо всех сил стараюсь обернуть голову вокруг хорошего способа справиться с рекурсивным включением.

Например:

a.c:

//? include ("a.h");

int main(int argc, char **argv)
{
return 0;
}

хиджры:

#ifndef A_H
#define A_H
//? include ("b.h");
//? include ("c.h");
#endif /* A_H */

b.h:

#ifndef B_H
#define B_H

#endif /* B_H */

c.h:

#ifndef C_H
#define C_H

#endif /* C_H */

Я хочу, чтобы этот синтаксический анализатор взял исходный файл, который я хочу предварительно обработать, и вывел результат, такой как (да, я вырезал / вставил):

#ifndef A_H
#define A_H
#ifndef B_H
#define B_H

#endif /* B_H */
#ifndef C_H
#define C_H

#endif /* C_H */
#endif /* A_H */

int main(int argc, char **argv)
{
return 0;
}

через что-то вроде:

php parser.php infile.c outfile.c

Я думаю о том, как мне следует реализовать такой парсер, но я изо всех сил пытаюсь выразить, как это работает.

Это мой текущий мыслительный процесс, который тривиален, но дает мне возможность начать:

<?php

$infile = $argv[1];
$outfile = $argv[2];

$startFile = file_get_contents($infile);

/* begin transformations */
function transform($t)
{
/* not sure how to express the transformation */

return $t;
}

$output = transform($startFile);
/* end of transformations */

file_put_contents('out.c', $outfile);
?>

Я знаю, что шаблон включения:

$regex = "/[\/][\/][?](?:\s+)(?:include)(?:\s*)(?:[(]\s*)(?:(?:[\"](.*)[\"])|(?:['](.*)[']))(?:\s*)[)];/";

Как я могу сделать это?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]