man/system_admin
man · Sistem Yönetimi

$ treereg

Bölüm 1 · Sistem Yönetimi

Ağaç Düzenli İfadeleri için Derleyici

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} = or return('',undef);

$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