The WeakReference class, monitoring memory leak and garbage collection in a Java application

Image
 Below is a Stack implementation that uses an internal resizeable array structure.  public class MyStack< T > implements Stack< T > { private static final int CAPACITY = 100 ; private Object[] array ; private int pos = 0 ; public MyStack () { this . array = new Object[ CAPACITY ] ; } @Override public void push ( T item) { if ( pos >= array . length / 2 ) { Object[] newArray = new Object[ pos * 2 ] ; System. arraycopy ( array , 0 , newArray , 0 , array . length ) ; array = newArray ; } array [ pos ++] = item ; } @Override public T pop () { if (isEmpty()) { throw new RuntimeException( "empty stack" ) ; } @SuppressWarnings ( "unchecked" ) T item = ( T ) array [ pos - 1 ] ; pos -= 1 ; return item ; } @Override @SuppressWarnings ( "unchecked" ) public T peek...

"REGULAR EXPRESSIONS" KONUSUNU TAM OLARAK VE KOLAYCA ANLAMAK

Herhangi bir dilde yazılmış bilgisayar programının derlenebilmesi veya yorumlanabilmesi için öncelikle "lexical analysis" denilen aşamadan geçmesi gerekiyor. Bu aşamada program kelimelere veya "token" denilen yapıtaşlarına ayrılıyor.

Programlama dilinin sentaksı, tokenlerin türleri hakkında bilgi verir. Örneğin birçok dilde yer alan bazı token türleri:

ID
Örnek: price calculateRate lastItem

NUM
Örnek: 73 0

REAL
Örnek: 12.5 0.23

COMMA
,

IF
if

Bir lexical analyser (lexer) yazabilmek için herhangi bir programlama dili kullanılabilir. Fakat özellikle "regular expressions" dili bu iş için kullanıma uygun.

Regular Expressions


Dil (language), bir string kümesi olarak tanımlansın. Örneğin Java dili, legal java programı oluşturabilecek tüm string lerin kümesidir. Bu durumda Java dili sonsuz elemana sahip bir küme.
Peki bir dili (belki sonsuz elemana sahip), nasıl sonlu ifadelerle (açıklamalarla) tanımlayabiliriz?

İşte burada "regular expressions" dilini kullanacağız. Bir regular expression, bir string kümesini ifade ediyor.

Alternation:


M ve N regular expression olsun. M | N yeni bir regular expression ifade eder.
Bir stringin M | N kümesinde yer alması için ya M ya da N kümesinde yer alması gerekir.

Örnekler:

a | b {"a", "b"}
1 | 2 | 3 {"1","2","3"}

Concatenation:


M ve N regular expression olsun. M . N yeni bir regular expression ifade eder.
Bir stringin M . N kümesinde yer alması için M veya N 'nin elemanlarından herhangi ikisinin birleştirilmesinden oluşması gerekir.

Örnekler:

a.b {"ab"}
a . (b | c) {"ab", "ac"}

Repetition:


M bir regular expression olsun. M* yeni bir regular expression ifade eder.
Bir stringin M* kümesinde yer alması için M kümesi içerisindeki sıfır veya daha fazla elemanın birleştirilmesinden oluşması gerekir.

Örnekler:

a* {"", "a", "aa", "aaaa", ...}
(a.b)* {"", "ab","abab","ababab", ...}
((a | b) · a)* {"", "aa","ba","aaaa","aaba", "baba","baaa","aabaaababa", ...}

Herhangi bir regular expression, semboller ve yukarıdaki operatörlerle ifade edilebilir. Fakat yararlı bazı kısaltmalar kullanılmaktadır:

MN M . N anlamındadır.
M+ M . M* anlamındadır. (Bir veya daha fazla)
M? Sıfır veya bir tane M
[abcd] a | b | c | d anlamındadır.
[a-d] a | b | c | d anlamındadır.
[a-c1-5] a | b | c | 1 | 2 | 3 | 4 anlamındadır.

Sonuç olarak yukarıda kuralları ifade edilen regular expressions dilini kullanarak, bir string kümesi ifade edebiliriz. Örneğin mümkün olan tüm e-mail adresleri kümesini ifade etmek için yukarıdaki basit kuralları kullanarak bir regular expression yazabiliriz.

Comments

Popular posts from this blog

Trie Data Structure and Finding Patterns in a Collection of Words

My Crappy Looking Solution to "Binary Tree Common Ancestor" Problem

A Graph Application in Java: Using WordNet to Find Outcast Words