Tujuannya adalah untuk membuat preprosesor untuk bahasa C, sekecil mungkin dalam hal ukuran kode sumber dalam byte , dalam bahasa pilihan Anda. Inputnya akan berupa file sumber C, dan outputnya akan menjadi kode sumber yang sudah diproses.
Item-item yang harus dapat diproses adalah: Penghapusan komentar (baris / blok), # sertakan arahan (dengan membuka file di jalur relatif dan mengganti teks pada titik yang diperlukan), #define, #undef, #if, #elif, #else, #endif, #ifdef, #ifndef, dan defined (). Arahan preprocessor C lainnya seperti #pragmas atau #errors dapat diabaikan.
Tidak perlu menghitung ekspresi aritmatika atau operator pembanding dalam arahan #jika kita mengasumsikan ekspresi akan bernilai true asalkan berisi bilangan bulat selain nol (penggunaan utamanya adalah untuk direktif yang didefinisikan ()). Contoh kemungkinan input dan output yang diikuti (kemungkinan spasi putih tambahan dalam file output dipangkas untuk penampilan yang lebih baik, tidak perlu kode Anda untuk melakukannya). Suatu program yang dapat memproses contoh-contoh berikut dengan benar akan dianggap memadai.
----Input file: foo.c (main file being preprocessed)
#include "bar.h" // Line may or may not exist
#ifdef NEEDS_BAZZER
#include "baz.h"
#endif // NEEDS_BAZZER
#ifdef _BAZ_H_
int main(int argc, char ** argv)
{
/* Main function.
In case that bar.h defined NEEDS_BAZ as true,
we call baz.h's macro BAZZER with the length of the
program's argument list. */
return BAZZER(argc);
}
#elif defined(_BAR_H_)
// In case that bar.h was included but didn't define NEEDS_BAZ.
#undef _BAR_H_
#define NEEDS_BARRER
#include "bar.h"
int main(int argc, char ** argv)
{
return BARRER(argc);
}
#else
// In case that bar.h wasn't included at all.
int main()
{return 0;}
#endif // _BAZ_H_
----Input file bar.h (Included header)
#ifndef _BAR_H_
#define _BAR_H_
#ifdef NEEDS_BARRER
int bar(int * i)
{
*i += 4 + *i;
return *i;
}
#define BARRER(i) (bar(&i), i*=2, bar(&i))
#else
#define NEEDS_BAZZER // Line may or may not exist
#endif // NEEDS_BARRER
#endif // _BAR_H_
----Input file baz.h (Included header)
#ifndef _BAZ_H_
#define _BAZ_H_
int baz(int * i)
{
*i = 4 * (*i + 2);
return *i;
}
#define BAZZER(i) (baz(&i), i+=2, baz(&i))
#endif // _BAZ_H_
----Output file foopp.c (no edits)
int baz(int * i)
{
*i = 4 * (*i + 2);
return *i;
}
int main(int argc, char ** argv)
{
return (baz(&argc), argc+=2, baz(&argc));
}
----Output file foopp2.c (with foo.c's first line removed)
int main()
{return 0;}
----Output file foopp3.c (with bar.h's line "#define NEEDS_BAZZER" removed)
int bar(int * i)
{
*i += 4 + *i;
return *i;
}
int main(int argc, char ** argv)
{
return (bar(&argc), argc*=2, bar(&argc));
}
#if
perlu didukung? yaitu apakah preprocessor perlu mendukung ekspresi dengan aritmatika, operasi bitwise, dll?Jawaban:
Flex, 1170 + 4 = 1174
1170 karakter dalam kode fleksibel + 4 karakter untuk bendera kompilasi. Untuk menghasilkan yang dapat dieksekusi, jalankan
flex pre.l ; gcc lex.yy.c -lfl
.Entri bocor memori seperti saringan dan tidak menutup file yang disertakan.Tetapi jika tidak, itu harus sepenuhnya berfungsi sesuai spesifikasi.Beberapa penjelasan:
a
danb
temps untuk menahan string dari input.a
juga digunakan sebagai parameter untuk berfungsif
.v
memegang nama-nama makro danV
memegang 'Nilai-nilai makrot
danT
merupakan pemegang sementara ketika kita tumbuhv
danV
i
adalah 'i'ncrementer untuk loops
adalah 's'ize dari array makroo
adalah hitungan dari 'o'penif
s di dalam kondisi palsug()
g'rows array makrof()
'menemukan makro dengan nilai yang samav
sebagaia
d(y)
'memilihy
karakter terakhir dari input saat iniD
adalah di dalam 'D'efineF
adalah untuk mengabaikan persyaratan F'alseI
adalah untuk 'Saya mengingatelse
/elif
setelah kondisi yang benar ditemukan.EDIT1: membersihkan banyak kebocoran memori dan menerapkan penutupan file
EDIT2: kode yang dimodifikasi untuk menangani makro bersarang lebih benar
EDIT3: jumlah golf yang gila
EDIT4: lebih banyak bermain golf
EDIT5: lebih banyak bermain golf; Saya juga memperhatikan bahwa panggilan saya ke fclose () menyebabkan masalah pada beberapa komputer ... melihat hal ini.
sumber
#include
barang, tapi saya kira ini terkait dengan bug di edit # 5. Juga tidak menggantikan makro, meskipun berhasil memproses blok # jika - kecuali saya melakukan sesuatu yang salah ... tetapi secara umum itu terlihat sangat baik, dan itu memberikan gambaran kasar tentang apa yang dapat dilakukan oleh seorang lexer, karena Saya bisa memahaminya bahkan dalam bentuk golf. Cobalah untuk melihat apakah bug dapat diperbaiki, jika tidak ok, karena kode menjelaskan dengan baik, mungkin ini akan dipilih karena tidak ada entri lain.