← man/dev_and_programming
eyapp — man eyapp — 80×24
ugur@toprak:~/man/dev_and_programming$man eyapp
Bölüm 1 Geliştirme & Programlama

eyapp

Parse::Eyapp modülü için bir Perl ön yüzüdür (front-end)

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 bir grammar.output dosyası 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ı:

  1. 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)