Sözdizimi
eyapp [options] grammar[.eyp]
eyapp -V
eyapp -h
grammar Dil bilgisi (grammar) dosyası. Herhangi bir sonek verilmemişse
ve dosya mevcut değilse, .eyp eklenir.
Açıklama
eyapp derleyicisi, Parse::Eyapp dil bilgisi girdi dosyalarını Perl LALR(1) Nesne Yönelimli ayrıştırıcı (parser) modüllerine derlemenizi sağlayan Parse::Eyapp modülü için bir ön yüzdür.
Detaylı Seçenekler
-v: Ayrıştırıcınızı tanımlayan birgrammar.outputdosyası oluşturur. Size çelişkilerin (conflicts), kuralların, DFA (Deterministic Finite Automaton) durumlarının ve ayrıştırıcının genel kullanımının bir özetini gösterecektir.
-N seçeneğini içerir. Durumların daha ayrıntılı bir açıklamasını üretmek için LALR tabloları sıkıştırılmaz. Sıkıştırılmış tablolara karşılık gelen bir .output dosyası üretmek için -vN kombinasyonunu kullanın.
-s: Ayrıştırma sürücüsünün (parsing driver) de dahil edildiği bağımsız (standalone) bir modül oluşturur. LALR sürücüsünü içeren modüller (Parse::Eyapp::Driver), AST işlemleri için olanlar (Parse::Eyapp::Node ve Parse::Eyapp::YATW) ve Parse::Eyapp::Base, oluşturulan modülün içinde neredeyse kelimesi kelimesine yer alır.
Bir programdan çağrılan birden fazla ayrıştırıcı modülünüz varsa, bunu bağımsız yapmak için bu seçeneğe dil bilgisi dosyalarınızdan yalnızca biri için ihtiyacınız olduğunu unutmayın.
-n: Ayrıştırıcı modülünüze gömülü kaynak dosya satır numaralandırmasını devre dışı bırakır. Neden ihtiyaç duyulacağını bilmiyorum ama orada.
-m module
Ayrıştırıcı modülünüze module paket adını (veya ad alanını, modül adını, sınıf adını ya da her ne ad veriyorsanız) verir. Varsayılan olarak dil bilgisinin (grammar) adını alır.
-o outfile
Derlenen çıktı dosyası ayrıştırıcı modülünüz için outfile olarak adlandırılacaktır. Varsayılan olarak grammar.pm'dir veya -m A::Module::Name seçeneğini belirttiyseniz (aşağıya bakın) Name.pm olacaktır.
-c grammar[.eyp]
Çıktı (STDOUT) olarak eylemler (actions) içermeyen dil bilgisini üretir. Yalnızca sözdizimsel kısımlar görüntülenir. -v seçeneği de eklenirse yorumlar da kaldırılacaktır.
-t filename
-t filename seçeneği, ayrıştırıcı çıktısını üretmek için şablon (template) olarak kullanılması gereken bir dosya belirtmenize olanak tanır. Varsayılan, Parse::Eyapp::Output.pm içinde tanımlanan dahili şablonu kullanmaktır. Kendi şablonunuzu nasıl yazacağınız ve hangi değiştirmelerin (substitutions) mevcut olduğu hakkında Parse::Eyapp::Output.pm modülüne bakın; oldukça açıktır.
-b shebang
"shebang" olarak adlandırılan satırları anlayan sistemlerde çalışıyorsanız ve oluşturulan ayrıştırıcınız doğrudan çalıştırılabilir bir betik ise, -b seçeneğiyle bir tane belirtebilirsiniz, örneğin:
eyapp -b '/usr/local/bin/perl -w' -o myscript.pl myscript.yp
Bu, ilk satırı şu olan myscript.pl adında bir dosya çıktısı verecektir:
#!/usr/local/bin/perl -w
Bağımsız değişken zorunludur, ancak boş bir karakter dizisi belirtirseniz, bunun yerine $Config{perlpath} değeri kullanılacaktır.
-B prompt
Çıktı dosyasının en son satırına bir modulino çağrısı olan __PACKAGE__->main(<prompt>) unless caller(); satırını ekler. Bağımsız değişken zorunludur.
-C grammar.eyp
-b '' ve -B '' seçeneklerinin birleşik kullanımının bir kısaltmasıdır.
-T grammar.eyp
%tree yönergesine eşdeğerdir.
-N grammar.eyp
%nocompact yönergesine eşdeğerdir. LALR eylem tablolarını sıkıştırmaz.
-l: Varsayılan bir sözcüksel çözümleyici (lexical analyzer) sağlamaz. Varsayılan olarak "eyapp",%token = /regexp/tanımlarınızdan bir sözcüksel çözümleyici oluşturur.
grammar
Girdi dil bilgisi dosyası. Herhangi bir sonek verilmemişse ve dosya mevcut değilse, çıkış yapılmadan önce .eyp sonekiyle dosya açılmaya çalışılır.
-V: Parse::Eyapp'ın güncel sürümünü görüntüler ve düzgün bir şekilde çıkar.-h: Kullanım ekranını görüntüler.
Örnek
Aşağıdaki "eyapp" programı, "2+3*4" gibi bir infix (içten ekli) ifadeyi postfix (sondan ekli) biçimine dönüştürür: "2 3 4 * +"
%token NUM = /([0-9]+(?:\.[0-9]+)?)/
%token VAR = /([A-Za-z][A-Za-z0-9_]*)/
%right '='
%left '-' '+'
%left '*' '/'
%left NEG
%defaultaction { "$left $right $op"; }
%%
line: $exp { print "$exp\n" }
;
exp: $NUM { $NUM }
| $VAR { $VAR }
| VAR.left '='.op exp.right
| exp.left '+'.op exp.right
| exp.left '-'.op exp.right
| exp.left '*'.op exp.right
| exp.left '/'.op exp.right
| '-' $exp %prec NEG { "$exp NEG" }
| '(' $exp ')' { $exp }
;
%%
Sözdizimsel çözümleyici (lexer) ve hata raporlama alt programları yazmaya gerek olmadığını unutmayın. İlk olarak, dil bilgisini derliyoruz:
pl@nereida:~/LEyapp/examples/eyappintro$ eyapp -o postfix.pl -C Postfix.eyp
Eğer -C seçeneğini kullanırsak ve hiçbir main() yazılmamışsa varsayılan bir main alt programı sağlanır. Artık ortaya çıkan programı çalıştırabiliriz:
pl@nereida:~/LEyapp/examples/eyappintro$ ./postfix.pl -c 'a = 2*3 +b'
a 2 3 * b + =
Uyumsuz bir girdi verildiğinde, doğru bir hata mesajı üretir:
pl@nereida:~/LEyapp/examples/eyappintro$ ./postfix.pl -c 'a = 2**3 +b'
Syntax error near '*'.
Expected one of these terminals: '-' 'NUM' 'VAR' '('
There were 1 errors during parsing
Yazar
Casiano Rodriguez-Leon
Telif Hakkı
Telif Hakkı © 2006, 2007, 2008, 2009, 2010, 2011, 2012 Casiano Rodriguez-Leon. Telif Hakkı © 2017 William N. Braswell, Jr. Tüm Hakları Saklıdır.
Parse::Yapp Telif Hakkı © 1998, 1999, 2000, 2001, Francois Desarmenien. Parse::Yapp Telif Hakkı © 2017 William N. Braswell, Jr. Tüm Hakları Saklıdır.
Bu kütüphane serbest bir yazılımdır; Perl'in kendisiyle aynı koşullar altında, yani Perl sürüm 5.8.8 veya tercihinize göre daha sonraki herhangi bir Perl 5 sürümü altında yeniden dağıtabilir ve/veye değiştirebilirsiniz.
Ayrıca Bakınız
• Parse::Eyapp,
• perldoc vgg,
• Parse::Eyapp ile Karakter Dizilerini ve Ağaçları Ayrıştırma (Yedi sayfada Derleyici İnşasına Giriş) kılavuzu,
• http://nereida.deioc.ull.es/~pl/perlexamples/Eyapp.pdf adresindeki PDF dosyası,
• http://nereida.deioc.ull.es/~pl/perlexamples/section_eyappts.html (İspanyolca),
• eyapp,
• treereg,
• Parse::yapp,
• yacc(1),
• bison(1),
• Alfred V. Aho, Ravi Sethi ve Jeffrey D. Ullman'ın klasik "Compilers: Principles, Techniques, and Tools" kitabı (Addison-Wesley 1986),
• Parse::RecDescent.
POD Hataları
Hey! Yukarıdaki belgede aşağıda açıklanan bazı kodlama hataları vardı:
- satır civarında: =encoding yönergesinden önce ASCII olmayan karakter '©' görüldü. UTF-8 varsayılıyor.
perl v5.34.0 2017-06-14 EYAPP(1)