Я пишу препроцессор 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*)[)];/";
Как я могу сделать это?
Задача ещё не решена.
Других решений пока нет …