Apakah ekspresi reguler

16

Jika saya memiliki Tata Bahasa Tipe 3, itu dapat direpresentasikan pada otomat pushdown (tanpa melakukan operasi apa pun pada stack) sehingga saya dapat mewakili ekspresi reguler dengan menggunakan bahasa bebas konteks. Tapi bisakah saya tahu jika tata bahasa tipe 3 adalah , L L ( 1 ) , S L R ( 1 ) , dll. Tanpa membuat tabel parse?L.R(1)L.L.(1)SLR(1)

Andrea Tucci
sumber

Jawaban:

15

Semua bahasa reguler memiliki tata bahasa LL (1). Untuk mendapatkan tata bahasa seperti itu, ambil DFA apa pun untuk bahasa reguler (mungkin dengan melakukan konstruksi subset pada NFA yang diperoleh dari ekspresi reguler), kemudian mengubahnya menjadi tata bahasa reguler rekursif-kanan. Tata bahasa ini kemudian LL (1), karena setiap pasangan produksi untuk nonterminal yang sama dapat dimulai dengan simbol yang berbeda, atau satu menghasilkan ε dan memiliki $ sebagai toahead token. Akibatnya, semua bahasa reguler juga LR (1), karena tata bahasa LL (1) apa pun adalah LR (1). Selain itu, dengan menggunakan hasil penting dari makalah ini , Anda dapat menunjukkan bahwa bahasa LR (1) apa pun memiliki tata bahasa SLR (1), artinya setiap bahasa biasa memiliki tata bahasa SLR (1).

Namun, bahasa reguler tidak semuanya LR (0). Bahasa LR (0) memiliki sifat yang sangat spesifik - khususnya, mereka harus bebas awalan. Jadi bahasa reguler {a, aa} bukan LR (0), meskipun jelas reguler (regex a | (aa)). Namun, bahasa LR (0) tidak terkandung dengan benar dalam bahasa reguler; tata bahasa ini untuk {0 n 21 n | n ≥ 1} adalah LR (0), tetapi bahasanya tidak teratur:

S -> E
E -> 0E1 | 2

Semoga ini membantu!

templatetypedef
sumber
2
Fakta bahwa tata bahasa reguler-kanan menerima set persis bahasa reguler biasanya dilakukan di kelas (atau bahkan latihan), jadi jawabannya adalah yang jauh lebih langsung.
Raphael
2

Sintaks ekspresi reguler (polos lama) (Anda mengatakan "representasi") adalah LR (0). Anda tidak memerlukan lookahead untuk mengurai string yang mewakili regex. Anda dapat dengan mudah memutuskan ini dengan menjalankan generator parser pada tata bahasa untuk regex: -} Anda juga dapat dengan mudah mengode parser keturunan rekursif sederhana (LL (0)) untuk regexps; apa pun yang LL (0) adalah LR (0).

Saya tidak tahu apakah sintaks yang lebih rumit yang disebut "regexps" seperti Perl adalah seperti ini; tetapi regexps Perl secara ketat lebih kuat daripada regexps sehingga mereka bukan regexps tua biasa.

Untuk menentukan apakah tata bahasa memiliki beberapa properti, Anda harus menjalankan semacam predikat. Untuk menentukan apakah itu (S) LR (k), Anda harus menjalankan predikat yang dapat memeriksa properti itu. Akibatnya, setiap predikat tersebut harus berlaku membangun tabel parse, karena cara mereka didefinisikan.

Ira Baxter
sumber
Ekspresi reguler Perl bekerja pada NFA
Pertanyaannya bukan tentang bagaimana regexps Perl bekerja. Itu tentang apakah (Perl?) Regexps dapat diuraikan oleh teknologi tertentu. Saya bisa percaya Perl regexps menggunakan NFA untuk melakukan pencocokan mereka, bersama dengan beberapa pengambilan data yang sensitif terhadap konteks lainnya, tapi saya tidak melihat relevansi dengan pertanyaan.
3
-1 Ekspresi reguler bukan LR (0). Bahasa LR (0) harus bebas awalan, tetapi ekspresi reguler a|(aa)menjelaskan bahasa yang tidak bebas awalan. Selain itu, bahasa LR (0) tidak dapat menangani tata bahasa dengan produksi epsilon, jadi bahasa biasa {epsilon, a} bukan LR (0). Namun, bahasa regulernya adalah LL (1) karena Anda dapat menulisnya sebagai tata bahasa biasa, dan karenanya semuanya LR (1). Karena bahasa LR (1) mana pun memiliki tata bahasa SLR (1), ini berarti semua bahasa reguler adalah SLR (1).
templatetypedef
1
Mengenai LL (0), itu sebaliknya: Bahasa LL (0) adalah bagian yang tepat dari bahasa reguler. Perhatikan bahwa LL (0) berarti Anda tidak menggunakan lookahead untuk memutuskan antara derivasi yang berbeda - yang pada dasarnya berarti tidak ada keputusan dan bahasanya terdiri dari satu kata. LR (0), sebaliknya, adalah kelas yang berguna - sekali lagi Anda tidak menggunakan lookahead untuk memutuskan (di sini untuk reduksi), tetapi masih ada beberapa perbedaan karena fakta bahwa pergeseran dapat membedakan antara produksi yang berbeda.
1
@ IraBaxter- Sintaks ekspresi reguler bukan LR (0) karena ekspresi reguler tidak bebas awalan. Mereka juga bukan LL (0), karena bahasa LL (0) hanya dapat berisi string tunggal (atau tanpa string).
templatetypedef