2009-06-10 10 views
7

Normal bir ifade motoru yazmaya çalışıyorum. Elle yinelemeli bir soy ayrıştırıcısı yazmak istiyorum. Düzenli ifadelerin dili (normal ifadelerle tanımlanabilecek diller değil) için özyinelemeye yer bırakmadan bağlam-içermeyen bir dilbilgisi nasıl görünürdü? Sözdizimsel şekeri yeniden hesaplamak en kolayı olur mu yani a+aa*? Şimdiden teşekkürler!Bağlamsız gramer normal ifadeleri açıklıyor mu?

cevap

7

Sol özyineleme:

Expression = Expression '|' Sequence 
      | Sequence 
      ; 

Sequence = Sequence Repetition 
     | <empty> 
     ; 

Sağ özyineleme:

Expression = Sequence '|' Expression 
      | Sequence 
      ; 

Sequence = Repetition Sequence 
     | <empty> 
     ; 

Muğlak formu:

Expression = Expression '|' Expression 
      | Sequence 
      ; 

Sequence = Sequence Sequence 
     | Repetition 
     | <empty> 
     ; 
+0

Sağ üzerinde; Bu akşam bütün sorularıma cevap verdin. Teşekkürler! – wkf

0

Left Recursion'daki wikipedia makalesi, bunu nasıl çekeceğiniz konusunda oldukça iyi bilgiler verir.

+0

Bir dilbilgisini sol özyinelemeyle yeniden hesaba katmam gerekmiyor, aksine dilbilgisinin genel olarak neye benzemesi gerektiği konusunda bir fikir edinmeye çalışıyorum. Onlar hakkında çok şey okurken, aslında hiç konuşmam için bağlamda bir dilbilgisi grameri kullanmamıştım. – wkf

2

Sen source code for Plan 9 grep bakabilir. Düzenli ifadeler için grep.y dosyası yacc (doğru hatırlıyorsam LALR (1)) dilbilgisine sahiptir. Yacc dilbilgisinden başlayabilir ve tekrarlayan soy ayrıştırma için yeniden yazabilirsiniz.

İlgili konular