Pegjs: Operator yang tidak serakah untuk * , + , dan ?

Dibuat pada 7 Okt 2011  ·  7Komentar  ·  Sumber: pegjs/pegjs

Saya memiliki bahasa di mana ada contoh berulang dari pola yang sama di mana saya hanya peduli dengan simbol pertama. Sebagai contoh:

          system       OBJECT IDENTIFIER ::= { mib-2 1 }
          interfaces   OBJECT IDENTIFIER ::= { mib-2 2 }
          at           OBJECT IDENTIFIER ::= { mib-2 3 }
          ip           OBJECT IDENTIFIER ::= { mib-2 4 }
          icmp         OBJECT IDENTIFIER ::= { mib-2 5 }
          tcp          OBJECT IDENTIFIER ::= { mib-2 6 }
          udp          OBJECT IDENTIFIER ::= { mib-2 7 }
          egp          OBJECT IDENTIFIER ::= { mib-2 8 }

Contoh sederhana ini dapat dicocokkan dengan pola ini (di mana _ adalah spasi putih):

identifier _ "OBJECT IDENTIFIER" _ "::=" _ "{" _ identifier _ number _ "}"

Ini bukan masalah besar dalam kasus ini (saya sudah mengetik polanya :-) Tetapi bahasa tersebut memiliki satu set konstruksi berbulu besar lainnya yang tidak menjamin penguraian penuh (saya hanya ingin pengenal awal pada setiap baris untuk melakukan pekerjaan yang saya pikirkan).

Saya ingin mengetik sesuatu seperti pola ini:

identifier _ "OBJECT IDENTIFIER" .*? "}"

Dimana ".*?" tidak serakah - hanya mengkonsumsi terminal kemunculan pertama. Mungkinkah ini ada dalam daftar untuk PEG.js? Terimakasih banyak.

Komentar yang paling membantu

Dalam formalisme PEG , Anda dapat dengan mudah mencocokkan hingga terminator dengan menggunakan predikat bersama dengan metakarakter . . Sesuatu seperti:

"OBJECT IDENTIFIER" (!"}" .)* "}"

Apakah itu cukup bagi Anda?

Semua 7 komentar

Pembaruan: Ini dapat dipenuhi dengan jumlah pengulangan (yang merupakan generalisasi dari pemikiran awal saya) seperti yang disarankan di Grup Google di: http://groups.google.com/group/pegjs/browse_thread/thread/2bea15581be45187

Dalam formalisme PEG , Anda dapat dengan mudah mencocokkan hingga terminator dengan menggunakan predikat bersama dengan metakarakter . . Sesuatu seperti:

"OBJECT IDENTIFIER" (!"}" .)* "}"

Apakah itu cukup bagi Anda?

Ya, itu bekerja dengan sempurna. Terima kasih!

@dmajda Apa praktik yang disarankan untuk !"}" ?

Sebagai contoh:

   = chars:(!"-suffix" .)+ "-suffix"

"foo-suffix" => [[ '', 'f' ], ['', 'o' ], ['', 'o' ]]  // result
"foo-suffix" => ['f', 'o', 'o' ] // desired result

Saya dapat mencapai ini dengan memecah !"-suffix" . menjadi aturannya sendiri yang hanya mengembalikan hasil . , tetapi saya ingin tahu apakah ada cara yang lebih baik.

66 akan memperbaikinya.

Saya pikir sementara Anda dapat menggunakan:

    = chars:(!"-suffix" c:. {return c})+ "-suffix"

@islandr Tolong jangan gunakan isu sebagai tempat untuk bertanya tentang penggunaan PEG.js. Terutama ketika mereka tutup dan terutama ketika Anda menanyakan sesuatu yang orang lain di samping saya dapat membantu Anda. Saluran yang tepat adalah Grup Google .

maaf david. Kupikir ini akan menjadi tempat yang bagus sejak itu
berhubungan langsung dengan contoh yang Anda berikan.

Pada Wed, Jan 9, 2013 at 21:51, David Majda [email protected] :

@islandr https://github.com/islandr Tolong jangan gunakan masalah sebagai tempat
untuk bertanya tentang penggunaan PEG.js. Apalagi saat mereka tutup dan
terutama ketika Anda menanyakan sesuatu yang orang lain di samping saya bisa
membantu Anda. Saluran yang tepat adalah Grup Googlehttp://groups.google.com/group/pegjs
.


Balas email ini secara langsung atau lihat di Gi tHubhttps://github.com/dmajda/pegjs/issues/57#issuecomment -12083927.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

dmajda picture dmajda  ·  15Komentar

vldmr1986 picture vldmr1986  ·  12Komentar

audinue picture audinue  ·  13Komentar

futagoza picture futagoza  ·  13Komentar

mreinstein picture mreinstein  ·  12Komentar