Pertanyaan Tingkatkan Contoh Pemetik Angka Romawi Spirit


Berusaha belajar meningkatkan semangat dan contoh yang diberikan dalam dokumen membuat saya sedikit bingung.

Mengacu pada kode ini:

http://www.boost.org/doc/libs/1_46_1/libs/spirit/example/qi/roman.cpp 

Khususnya segmen tata bahasa ini:

        start = eps             [_val = 0] >>
            (
                +lit('M')       [_val += 1000]
                ||  hundreds    [_val += _1]
                ||  tens        [_val += _1]
                ||  ones        [_val += _1]
            )

Bisakah seseorang menjelaskan kepada saya mengapa itu + menyala ('M') dan tidak * menyala ('M'). Karena toh tidak bisa ada nol atau lebih M versus satu atau lebih M?


5
2017-08-24 17:10


asal


Jawaban:


Kedua +lit('M') dan *lit('M') benar. Tetapi yang pertama lebih mudah dibaca daripada yang terakhir (semantis), menurut pendapat saya, seperti yang disebutkan sebelumnya menambahkan  1000 untuk _val jika ada one cocok, dan lakukan berulang kali. Di sisi lain, yang terakhir sulit dibaca, karena orang bisa membacanya sebagai menambahkan  1000 untuk _val  bahkan untuk zero-match yang salah. 1000 tidak ditambahkan ke _val untuk pertandingan zero-times, namun parser *lit('M') tampaknya cocok untuk pertandingan nol juga (sepertinya agak membingungkan).

Begitu +lit('M') lebih baik.


Baik. Saya membaca komentar Anda. CCLLIX bukan angka romawi yang valid. Menurut Anda, apa nilainya? 309? Jika memang demikian, maka nilai untuk apa CCCIX? Ini terlalu 309, dan itu benar. Hormat Anda salah. Oleh karena itu parser berhenti ketika Anda menggunakan *lit('M'). Perhatikan juga bahwa parser juga akan berhenti meskipun Anda menggunakannya +lit('M') untuk masukan yang salah ini.


0
2017-08-24 17:16



Itu a || b operator dalam Spirit berarti a atau b, tapi b setelah a, jika a terjadi. Di belakang operator, kasus yang tidak ada M tersirat (karena cocok untuk M mungkin atau mungkin tidak hadir). Juga, dalam kasus *lit('M'), apakah Anda akan mengatakan bahwa aturan pertama cocok jika ada TIDAK  M? Itu akan berlaku pula, dan _val akan ditambah dengan 1000.


2
2017-08-24 17:18



Ini (Satu atau lebih Ms) ATAU ratusan ATAU 10 ATAU. (Nol atau lebih Ms) ATAU ratusan ATAU 10 ATAU yang tidak akan cocok dengan Ms alias string kosong dan tanpa berarti menambah 1000.


0
2017-08-24 17:20



Mencocokkan ekspresi A || B dalam Qi berarti mencocokkan saja A, atau hanya B atau A followed by B. Karena itu, dalam kasus Anda +lit('M') || hundreds cara +lit('M'), atau hundreds atau +lit('M')followed by hundreds. Untuk alasan ini, tata bahasa memungkinkan untuk mencocokkan angka romawi yang bahkan tidak dimulai dengan angka M.


0
2017-08-26 11:29