Pertanyaan Cara mudah untuk mem-pars .h file untuk komentar menggunakan Python?


Cara mem-parsing dengan cara mudah a .h file yang ditulis dalam C untuk komentar dan nama entitas menggunakan Python?

Kami kira untuk menulis lebih lanjut konten ke dalam file kata yang sudah dikembangkan.

Komentar sumber diformat menggunakan aturan gaya tag sederhana. Tag komentar digunakan untuk membedakan satu komentar entitas yang mudah dari komentar lain dan yang tidak mendokumentasikan. Komentar bisa dalam bentuk multi-baris. Setiap komentar tetap berada di atas definisi entitas:

//ENUM My comment bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
//     could be multi-line. Bla bla bla bla bla bla bla bla bla.
enum my_enum
{
    //EITEM My enum item 1.
    //      Just could be multi-line too.
    MY_ENUM_ITEM_1,

    //EITEM My enum item 2
    MY_ENUM_ITEM_2,
};

//STRUCT My struct
struct my_struct {

    //MEMBER struct member 1
    int m_1_;
};

//FUNC my function 1 description.
//     Could be multi-line also.
//INPUT  arg1 - first argument
//RETURN pointer to an allocated my_struct instance.
my_struct* func_1(int arg1);

Sebuah pohon kode dan komentar akan muncul sebagai hasil dari penguraian ini.

Bagaimana cara membuatnya cepat dan tanpa menggunakan pustaka pihak ketiga?


4
2018-03-30 16:27


asal


Jawaban:


Inilah solusi cepat dan kotor. Ini tidak akan menangani komentar dalam string, tetapi karena ini hanya untuk file header yang seharusnya tidak menjadi masalah.

S_CODE, S_INLINE, S_MULTLINE = rentang (3)
f = terbuka (sys.argv [1])
keadaan = S_CODE
komentar = ''
i = iter (lambda: f.read (1), '')
sementara True:
    mencoba:
        c = i.next ()
    kecuali StopIteration:
        istirahat
    jika keadaan == S_CODE:
        jika c == '/':
            c = i.next ()
            jika c == '*':
                negara = S_MULTLINE
            elif c == '/':
                negara = S_INLINE
    elif state == S_INLINE:
        komentar + = c
        jika c == '\ n':
            keadaan == S_CODE
    elif state == S_MULTLINE:
        jika c == '*':
            c = i.next ()
            jika c == '/':
                komentar + = '\ n'
                keadaan = S_CODE
            lain:
                komentar + = '*% s'% c
        lain:
            komentar + = c
cetak komentar

3
2018-03-30 17:10



Ini sudah dilakukan. Beberapa kali berakhir.

Berikut ini adalah parser untuk bahasa C yang ditulis dengan Python. Mulai dengan ini.

http://wiki.python.org/moin/SeeGramWrap

Parser lainnya.

http://wiki.python.org/moin/LanguageParsing

http://nedbatchelder.com/text/python-parsers.html

Anda mungkin dapat mengunduh tata bahasa ANSI C Yacc dan mengulanginya menjadi format PLY tanpa terlalu banyak masalah dan menggunakannya sebagai titik lompatan.


4
2018-03-30 16:41



Mungkin modul shlex akan lakukan?

Jika tidak, ada beberapa alternatif yang lebih kuat: http://wiki.python.org/moin/LanguageParsing


1
2018-03-30 16:34