Genel Bakış
treereg [-m paket_adı] [[no]syntax] [[no]numbers] [-severity 0|1|2|3] \
[-p agac_on_eki] [-o cikti_dosyası] [-lib /kütüphane/yolu/] -i dosya_adı[.trg]
treereg [-m paket_adı] [[no]syntax] [[no]numbers] [-severity 0|1|2|3] \
[-p agac_on_eki] [-lib /kütüphane/yolu/] [-o cikti_dosyası] dosya_adı[.trg]
treereg -v
treereg -h
Seçenekler
Seçenekler hem tek tire hem de çift tire ile kullanılabilir. Seçeneğin tam adını yazmak zorunlu değildir. Ayırt edici bir ön ek yeterlidir.
• "-i[n] dosya_adı"
Girdi dosyası. Eğer bir uzantı belirtilmemişse ".trg" uzantısı varsayılır.
• "-o[ut] dosya_adı"
Çıktı dosyası. Varsayılan olarak girdi dosyasının adına ".pm" eklenerek oluşturulur.
• "-m[od] paket_adı"
Üretilen alt programları (subroutine) içeren paketin adı. Varsayılan olarak, girdi dosyası adının, klasik '[a-z_A-Z]\w*' tamsayı tanımına uyan en uzun ön ekidir.
• "-l[ib] /kütüphane/yolu/"
"/kütüphane/yolu/" dizininin @INC dizisine dahil edileceğini belirtir. "syntax" seçeneği açık olduğunda kullanışlıdır. Gerektiği kadar çok kez eklenebilir.
• "-p[refix] agac_on_eki"
"Parse::Eyapp" kullanılarak otomatik olarak üretilen ağaç düğümleri, üretimin (production) adına atanmış (blessed) nesnelerdir. Olası çökmeleri önlemek için programcı, ayrıştırıcıyı çağırırken sınıf adlarının önüne belirli bir ön ek getirebilir; örneğin:
$self->YYParse( yylex => &_Lexer, yyerror => &_Error, yyprefix => PACKAGE."::")
"-prefix agac_on_eki" seçeneği, ağaç dil bilgisini yazma sürecini basitleştirir; böylece tam adlarla yazmak yerine:
CLASS::TIMES(CLASS::NUM, $x) and { $NUM->{VAL} == 0) => { $NUM }
şu şekilde yazılabilir:
TIMES(NUM, $x) and { $NUM->{VAL} == 0) => { $NUM }
• "-n[umbers]"
"#line" yönergeleri üretir.
• "-non[umbers]"
Ayrıştırıcınıza gömülü olan kaynak dosya satır numaralandırmasını devre dışı bırakır.
• "-sy[ntax]"
Perl kodunun söz dizimsel olarak doğru olup olmadığını kontrol eder.
• "-nosy[ntax]"
Perl kodunun söz dizimini kontrol etmez.
• "-se[verity] derece"
- 0 = Bağıntı sayısını (arity) kontrol etme (varsayılan). Eşleştirme işlemi bağıntı sayısını kontrol etmez. Ziyaret edilen gerçek düğüm daha fazla alt öğeye (children) sahip olabilir.
- 1 = Bağıntı sayısını kontrol et. Eşleştirme, gerçek düğüm ile şablonun alt öğe sayılarının eşit olmasını gerektirir.
- 2 = Bağıntı sayısını kontrol et ve bir uyarı ver.
- 3 = Bağıntı sayısını kontrol et, bir uyarı ver ve çıkış yap.
• "-v[ersion]"
Sürümü gösterir.
• "-u[sage]"
Kullanım bilgisini yazdırır.
• "-h[elp]"
Bu yardımı yazdırır.
Açıklama
"Treereg", bir dizi ağaç şablonunu ve bunları değiştirecek eylemleri açıklayan bir ağaç dil bilgisi belirleme dosyasını (varsayılan uzantısı ".trg" olan) aşağıdaki gibi ağaç terimlerini kullanarak dönüştürür:
TIMES(NUM, $x) and { $NUM->{VAL} == 0) => { $NUM }
Bu ifade; 0 değerine sahip sayısal bir ifadenin başka herhangi bir ifadeyle çarpımını temsil eden soyut bir söz dizimi ağacının bulunduğu her yerde, "TIMES" ağacının sol alt öğesiyle değiştirilebileceğini belirtir.
Derleyici, bu şablon-eylem kümelerini uygulayan alt programları içeren bir Perl modülü üretir.
Örnek
Aşağıdaki "eyapp" dil bilgisini göz önüne alın ("Parse::Eyapp" dil bilgileri hakkında daha fazla bilgi edinmek için "Parse::Eyapp" belgelerine bakın):
nereida:~/LEyapp/examples> cat Rule6.yp %{ use Data::Dumper; %} %right '=' %left '-' '+' %left '*' '/' %left NEG %tree
%% line: exp { $_[1] } ;
exp: %name NUM NUM | %name VAR VAR | %name ASSIGN VAR '=' exp | %name PLUS exp '+' exp | %name MINUS exp '-' exp | %name TIMES exp '' exp | %name DIV exp '/' exp | %name UMINUS '-' exp %prec NEG | '(' exp ')' { $_[2] } / Ağacı biraz basitleştirelim */ ;
%%
sub _Error { die "Syntax error.\n"; }
sub _Lexer { my($parser)=shift;
$parser->YYData->{INPUT}
or $parser->YYData->{INPUT} =
$parser->YYData->{INPUT}=~s/^\s+//;
for ($parser->YYData->{INPUT}) { s/^([0-9]+(?:.[0-9]+)?)// and return('NUM',$1); s/^([A-Za-z][A-Za-z0-9_]*)// and return('VAR',$1); s/^(.)//s and return($1,$1); } }
sub Run { my($self)=shift; $self->YYParse( yylex => &_Lexer, yyerror => &_Error ); }
"eyapp" kullanarak derleyin:
nereida:/LEyapp/examples> eyapp Rule6.yp
nereida:/LEyapp/examples> ls -ltr | tail -1
-rw-rw---- 1 pl users 4976 2006-09-15 19:56 Rule6.pm
Şimdi şu ağaç dil bilgisini göz önüne alın:
nereida:~/LEyapp/examples> cat Transform2.trg %{ my %Op = (PLUS=>'+', MINUS => '-', TIMES=>'*', DIV => '/'); %}
fold: 'TIMES|PLUS|DIV|MINUS':bin(NUM($n), NUM($m)) => { my $op = $Op{ref($bin)}; $n->{attr} = eval "$n->{attr} $op $m->{attr}"; $[0] = $NUM[0]; } zero_times_whatever: TIMES(NUM($x), .) and { $x->{attr} == 0 } => { $[0] = $NUM } whatever_times_zero: TIMES(., NUM($x)) and { $x->{attr} == 0 } => { $_[0] = $NUM }
/* çarpma ile ilgili kurallar */ times_zero = zero_times_whatever whatever_times_zero;
"treereg" ile derleyin:
nereida:/LEyapp/examples> treereg Transform2.trg
nereida:/LEyapp/examples> ls -ltr | tail -1
-rw-rw---- 1 pl users 1948 2006-09-15 19:57 Transform2.pm
Aşağıdaki program hem "Rule6.pm" hem de "Transform2.pm" modüllerini kullanmaktadır:
nereida:~/LEyapp/examples> cat foldand0rule6_3.pl #!/usr/bin/perl -w use strict; use Rule6; use Parse::Eyapp::YATW; use Data::Dumper; use Transform2;
$Data::Dumper::Indent = 1; my $parser = new Rule6(); my $t = $parser->Run; print "\n***** Before ******\n"; print Dumper($t); $t->s(@Transform2::all); print "\n***** After ******\n"; print Dumper($t);
Program "b*(2-2)" girdisi ile çalıştırıldığında aşağıdaki çıktıyı üretir:
nereida:~/LEyapp/examples> foldand0rule6_3.pl b*(2-2)
***** Before ****** $VAR1 = bless( { 'children' => [ bless( { 'children' => [ bless( { 'children' => [], 'attr' => 'b', 'token' => 'VAR' }, 'TERMINAL' ) ] }, 'VAR' ), bless( { 'children' => [ bless( { 'children' => [ bless( { 'children' => [], 'attr' => '2', 'token' => 'NUM' }, 'TERMINAL' ) ] }, 'NUM' ), bless( { 'children' => [ bless( { 'children' => [], 'attr' => '2', 'token' => 'NUM' }, 'TERMINAL' ) ] }, 'NUM' ) ] }, 'MINUS' ) ] }, 'TIMES' );
***** After ****** $VAR1 = bless( { 'children' => [ bless( { 'children' => [], 'attr' => 0, 'token' => 'NUM' }, 'TERMINAL' ) ] }, 'NUM' );
Daha karmaşık bir örnek için Parse::Eyapp içindeki "Compiling: More Options" bölümüne de bakın.
Ayrıca Bakınız
• Parse::Eyapp,
• eyapptut,
• 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 tarafından yazılan klasik "Compilers: Principles, Techniques, and Tools" kitabı ve
• Jeffrey D. Ullman (Addison-Wesley 1986),
• Parse::RecDescent.
Yazar
Casiano Rodriguez-Leon
Lisans Ve 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'ın Telif Hakkı © 1998, 1999, 2000, 2001, Francois Desarmenien'e aittir. Parse::Yapp'ın Telif Hakkı © 2017 William N. Braswell, Jr.'a aittir. Tüm Hakları Saklıdır.
Bu kütüphane ücretsiz bir yazılımdır; Perl'ün kendisiyle aynı şartlar altında, yani Perl sürüm 5.8.8 veya tercihinize bağlı olarak Perl 5'in daha sonraki herhangi bir sürümü altında yeniden dağıtabilir ve/veya değiştirebilirsiniz.
Pod Hataları
Hey! Yukarıdaki belgede bazı kodlama hataları vardı, bunlar aşağıda açıklanmıştır:
Satır 416 civarında: =encoding öncesinde ASCII olmayan karakter görüldü: '©'. UTF-8 varsayılıyor