2016-04-13 22 views
0

ben Boole ifadeleri bir özyinelemeli iniş ayrıştırıcı yazıyorum tarafından boolean ifadeler, içinde: 1 'True' olduğunuAyrıştırma + ve * örneğin özyinelemeli kökenli

(1 * 0) 
(0 + ~1) 
(0 * (1 + c) 

, 0 ' 'Yanlış' olduğunu + olduğu ya da ',' is 've', 'değil' ve 'c' sadece bir değişken ismidir (herhangi bir tek alfabetik harf olabilir). Bir çeşit işlem sırasını uygulamak yerine parantez kullanmayı düşünüyorum.

Bulunduğum ayrıştırıcı ifade

Expression ::= 1 
      | 0 
      | Character 
      | ~ Expression 

aşağıdaki formu tanıyabilir Ama bunun üstüne * + uygulamak ve edileceği konusunda emin değilim. Ben o-özyinelemeli sol 'gibi sonsuz bir döngüye neden misiniz

Expression ::= 1 
      | 0 
      | Character 
      | (Expression + Expression) 
      | (Expression * Expression) 

bariz uygulanmasını ne okudum oldukça eminim. Böyle sonsuz özyineyi ortadan kaldırmak için bunu nasıl değiştireceğime emin değilim.

+0

Yinelemeli bir soy ayrıştırıcısının nasıl yazılacağına dair cevabımı görün: http://stackoverflow.com/questions/2245962/is-there-an-alternative-for-flex-bison-that-is-usable-on- 8-bit gömülü sistemlerini/2336769 # 2336769 –

cevap

1

Parantez yerinde olduğunda, orada sahip olduğunuz özyinelemede bırakılmaz. Sol özyineleme, bir üretimin kendi aralarında tüketilen hiçbir belirteç olmadan (doğrudan ya da dolaylı olarak) ulaşabilmesidir. Bu tür dilbilgileri aslında özyineli soy ayrıştırıcılarında sonsuz tekrarlamaya neden olur, ancak bu sizinkilerle olamaz. Bir parantez sonra bilinmemektedir olmadığını + tüm sol ifadesi ayrıştırıldı kadar veya * formu çözümlenen ediliyor:

Sen bu haliyle dilbilgisi belirsiz olduğuna sorunu var. ... https://en.wikipedia.org/wiki/Recursive_descent_parser

lider

Expression ::= 1 
      | 0 
      | Character 
      | ParExpr 

ParExpr ::= (Expression ParOp Expression) 

ParOp ::= + 
     | * 
0

Bunu senin için arayalım: o soruna almanın

bir yolu paylaşılan önek/sonek üretiminde yaygın kısımlarını yukarı çekerek gereğidir LPAREN bunu sola özendirir. İfadeleri genellemek ve operatör önceliğine sahip olmak istiyorsanız, Wikipedia makalesinde BNF'nin ifade bölümünü izleyin. Bununla birlikte, seçtiğiniz dilbilgisinde bir sözdizim belirsizliği var demektir. Aynı önceliğe sahip işleçleriniz varsa, bunları

LogOp :: = + | *

Etiket benzer işlenenler genleşmesi için:

UnaryOp :: = ~

500 sadece benim son noktayı kapsayan bir iyi bir cevap yayınlanmıştır @ Şimdi ..., aldırma olabilir.