/\ [- /? |^ |-| /\ |\| /\ _\~ #/about #/posts #/projects #/links #/logs
[18Q01] Parsing menggunakan Definite clause grammar ----------------------------
_______________________________________
/ This depiction unambiguously \
| illustrates an apple, though |
\ rendered in ASCII art. |
--------------------------------------\/ ----
\ | |
.:' \ | |
__ :'__ ._|____|_.
.'`__`-'__``. |o_o |
:__________.-' |:_/ |
:_________: // \ \
:_________`-; (| | )
jgs `.__.-.__.' /'\_ _/`\
\___)=(___/
________________________________________________________________________________
[0] Definite Clause Grammar atau bisa disingkat DCG merupakan sebuah cara untuk
mengekspresikan sebuah tatabahasa, DCG dibuat pertama kali untuk prolog system,
karena salah satu tujuan prolog dubuat pertama kali ialah untuk melakukan
proses pada bahasa natural.
ketika kita membahas mengenai tatabahasa, kita juga akan bertemu dengan notasi
[1] BNF, BNF atau Backus–Naur form, BNF digunakan untuk mendeskripsikan syntax
dari sebuah bahasa program, saya akan menjelaskan kenapa DCG berhubungan dengan
BNF
+-( Prolog )-------------------------------------------------------------------+
| |
| a --> "". |
| a --> "a", a. |
| |
+------------------------------------------------------------------------------+
kode diatas adalah contoh sederhana dcg, syntax dcg dalam prolog mirip saat kita
membuat rule, syntax dcg adalah "Head --> Body", dalam "Body" bisa berupa
terminal, nonterminal dan grammar goals, jika kita baca kode prolog diatas:
"rule pertama adalah str kosong, rule kedua adalah string "a" dan sebuah str"
ketika kita menjalankan kode diatas, prolog system akan seperti ini:
+-( Prolog )-------------------------------------------------------------------+
| |
| ?- a(X, []). |
| %@ X = [] |
| %@ ; X = "a" |
| %@ ; X = "aa" |
| %@ ; X = "aaa" |
| %@ ; X = "aaaa" |
| %@ ; ... . |
| |
+------------------------------------------------------------------------------+
Prolog system akan mencari semua cara agar rulenya adalah benar, dari kode
prolog diatas saya bisa langsung mengubahnya ke notasi BNF atau sebaliknya,
seperti inilah notasi BNF:
+-( BNF )----------------------------------------------------------------------+
| |
| <a> ::= "a" ( <a> | " " ) |
| |
+------------------------------------------------------------------------------+
Dengan kekuatan ini, DCG merupakan sebuah language feature yang sangat kuat,
karna kita bisa melakukan parsing dengan mudah.
untuk contoh saya akan menggunakan kata-kata mudah "lahir tahun 2000", untuk DCG
seperti inilah kodenya
+-( Prolog )-------------------------------------------------------------------+
| |
| kalimat --> frasa_kerja, spasi, frasa_waktu. |
| frasa_kerja --> "lahir". |
| spasi --> " ". |
| frasa_waktu --> "tahun", tahun. |
| tahun --> "420". |
| |
+------------------------------------------------------------------------------+
outputnya adalah seperti ini:
+-( Prolog )-------------------------------------------------------------------+
| |
| ?- kalimat(X, []). |
| %@ X = "lahir tahun 420". |
| |
+------------------------------------------------------------------------------+
seperti sebelumnya Prolog system akan mencari variable X apa agar rulenya benar
disini nilai X adalah "lahir tahun 420", kita bisa langsung mengkonfersinya ke
Backus–Naur form.
+-( Prolog )-------------------------------------------------------------------+
| |
| <kalimat> ::= <frasa_kerja> <spasi> <frasa_waktu> |
| <frasa_kerja> ::= "lahir" |
| <frasa_waktu> ::= "tahun" <spasi> <tahun> |
| <tahun> ::= "2000" | "2001" | ... | "2099" |
| <spasi> ::= " " |
| |
+------------------------------------------------------------------------------+
cukup untuk perkenalanya, kita langsung ke parsing, selanjutnya saya akan
mencoba memparsing nomor tahun pada kode prolog sebelumnya, berekut kode yang
sudah saya modifikasi:
+-( Prolog )-------------------------------------------------------------------+
| |
| kalimat(Tahun) --> frasa_kerja, spasi, frasa_waktu(Tahun). |
| |
| frasa_kerja --> "lahir". |
| |
| spasi --> " ". |
| |
| frasa_waktu(Tahun) --> "tahun", spasi, tahun(Tahun). |
| |
| tahun([D|Ds]) --> [D], tahun(Ds). |
| tahun([]) --> []. |
| |
+------------------------------------------------------------------------------+
seperti inilah ketika saya menjalankan kode diatas:
+-( Prolog )-------------------------------------------------------------------+
| |
| ?- kalimat(X, "lahir tahun 420", []). |
| %@ X = "420" |
| %@ ; false. |
| |
+------------------------------------------------------------------------------+
setelah saya mempelajari DCG saya membuat aplikasi sederhana, yaitu kalkulator
sederhana dengan fitur interpreter seperti bahasa program python dkk, dan saya
juga membuat aplikasi truth table generator, dimana saya bisa membuat tabel
dengan input sebuah expresi boolean algebra.
trimakasih telah membaca sampai akhir, bila ada tulisan yang salah mohon maaf
atau bisa menghubungi saya via email, sampai jumpa.
Reference:
- [0] %/Definite_clause_grammar
- [1] %/Backus–Naur_form
?
________________________________________________________________________________
aerphanas (C) 2024 CC BY-SA 4.0
+---------------+------------------------+---------------+
| click to join | The tilde.club webring | click to join |
+---------------+------------------------+---------------+