namelist adalah konstruksi fortran yang berguna untuk menginisialisasi variabel dengan cepat dari file. namelist memiliki nama dan berisi sekumpulan variabel dengan tipe yang diketahui. Ini membuatnya mirip dengan konstruksi type.

Sering terjadi bahwa parameter yang diberikan ke program atau subrutin paling baik diatur bukan sebagai daftar, melainkan sebagai struktur hierarkis, seperti antarmuka menu. Jenis yang diperluas seperti type, extends(simple) :: advanced tampaknya merupakan representasi yang baik dari struktur hierarki ini.

Namun, membaca representasi data ini dengan konstruk namelist tampaknya menjadi canggung karena seseorang mungkin berakhir dengan daftar nama yang sangat panjang.

&options
 very_long_option_X   =  1,
 very_long_option_Y   =  2,
 long_option_B%long_descriptive_name_a = 10,
 long_option_B%long_descriptive_name_b = 20,
 long_option_D%long_suboption_DD%long_descriptive_name_a = 300,
 long_option_D%long_suboption_DD%long_descriptive_name_b = 400,
 long_option_D%long_suboption_DD%long_descriptive_name_c = 500,
/

Banyak orang akan mengatakan itu tidak ideal dan mereka lebih suka

&options
   very_long_option_X   =  1,
   very_long_option_Y   =  2,
   &long_option_B
      long_descriptive_name_a = 10,
      long_descriptive_name_b = 20
   /
   &long_option_D
      &long_suboption_DD
         long_descriptive_name_a = 300,
         long_descriptive_name_b = 400,
         long_descriptive_name_c = 500
      /
   /
/

Oleh karena itu, saya ingin bertanya apa pendekatan yang baik untuk membaca struktur data seperti itu. Bagaimana Anda menghadapi situasi seperti ini?

2
yarchik 9 Mei 2021, 16:56

3 jawaban

Jawaban Terbaik

File konfigurasi benar-benar merupakan area di mana bahasa khusus atau setidaknya pengurai tata bahasa khusus sering diterapkan. Tidak hanya oleh pemrogram Fortran, tetapi juga (atau terutama) oleh pemrogram dari banyak bahasa lain.

Pada dasarnya, seseorang membuat sketsa tata bahasa yang harus dipatuhi oleh file konfigurasi dan kemudian menulis pengurai untuk tata bahasa tersebut baik dengan tangan, biasanya sebagai pengurai keturunan rekursif yang dibuat dari fungsi rekursif yang menggunakan berbagai elemen tata bahasa atau sebagai mesin status dan transisi yang ditentukan antara negara bagian. Jika seseorang ingin menghindari rute manual, seseorang menggunakan generator parser (seperti ANTLR) atau kombinator parser. Alat-alat ini biasanya tidak menargetkan Fortran. Namun, pencarian di github.com akan mengungkapkan beberapa generator parser untuk Fortran terbaru!

Beberapa tahun yang lalu, ketika saya membutuhkan pengurai file konfigurasi di Fortran, saya menggunakan cara penurunan rekursif manual. Upaya sederhana saya dapat ditemukan di modul ParseTrees di https ://bitbucket.org/LadaF/elmm/src/master/src/strings.f90 tetapi masih jauh dari sempurna. Saya hanya menunjukkannya sebagai ilustrasi. Itu membaca file konfigurasi seperti https://bitbucket.org/LadaF /elmm/src/master/examples/DIPLOS/area_sources.conf.

Perpustakaan untuk format universal seperti JSON pasti dapat digunakan (dan ada implementasi Fortran, seperti https://github .com/jacobwilliams/json-fortran), tetapi Anda harus mengikuti spesifikasi formatnya. Misalnya, JSON tidak mengizinkan komentar dan itu tidak boleh bagi saya.

Cara lanjutan apa pun yang Anda pilih, Anda akan bertanggung jawab untuk menerjemahkan data dari pohon sintaks yang diurai ke dalam struktur data Anda. Tidak ada alat yang dapat melakukannya untuk Anda, AFAIAA. Itulah aspeknya, di mana daftar nama standar benar-benar bersinar.

2
Vladimir F 10 Mei 2021, 12:15

Apa yang saya lakukan dalam kode saya adalah saya akan memiliki variabel tambahan di daftar nama yang menunjuk ke file lain yang kemudian membaca isinya. Jadi:

&options
very_long_option_X   =  1,
very_long_option_Y   =  2,
long_option_B_filename = 'a_file'
long_option_D_filename = 'another_file'
/

Kemudian di a_file:

&long_option_B

  long_descriptive_name_a = 10,
  long_descriptive_name_b = 20
/

File_lain:

&long_option_D
  long_suboption_DD_filename = 'another_another_file'
/

Dll

Maka itu hanya kasus ketika membaca setiap daftar nama untuk melihat apakah nama file telah disetel dan jika demikian, baca file itu ke dalam daftar nama berikutnya.

1
Rob 10 Mei 2021, 09:07

Karena NAMELIST bersarang tidak ada, pendekatan lain mungkin lebih baik. XML tampaknya menjadi pilihan yang populer. Ada perpustakaan Fortran-XML yang tersedia, seperti XML-Fortran dan FoX.

3
Steve Lionel 9 Mei 2021, 15:50