2012-09-08 19 views
6

Bu pratik prensiplerden çok “prensipte” bir sorudur. Yacc'ın yapımları azalttığı düzen ve tanımlanan lexer'dan yeni tokenler okunuyor. Ben simgeler dizisinden aşağıdaki olsaydı bildirilir:Yacc'da azaltma sırası tanımlandı mı?

INTEGER_BEGIN 
INTEGER_VALUE 
LESS_THAN 
INTEGER_BEGIN 
INTEGER_VALUE 

neye yapımları bir dizi göz önüne alındığında, tek şeye INTEGER BEGIN INTEGER_VALUE azaltır önce Yacc, onun semantik içinde, lexer gelen LESS_THAN belirteci okuyabilir:

expr : expr LESS_THAN expr 
    | integer 

integer : INTEGER_BEGIN INTEGER_VALUE 

Bunlar anlamsal eylemlerle tanımlanmışsa, bu değişiklik için kurallar uygulanıyor mu?

cevap

4

Evet yapabilir. Yacc bir LALR (1) ayrıştırıcısı oluşturur - (1) lookahead'in 1 belirteci anlamına gelir - bu nedenle bu kuralı azaltmak için bir kural için belirteçlerin sonunu geçen 1 jetonu okuyabilir. Anlamsal eylemler, bir kuralı azaltmak için hemen önce çalıştırmak için sadece bazı C kodu olduğundan, anlamsal eylemlerin varlığı ilgisizdir.

HER ZAMAN okuduğunu belirten bir garanti olmadığına dikkat edin. Yacc veya bison tarafından oluşturulan ayrıştırıcı bazen 'varsayılan indirimleri' kullanır - bir sonraki işareti ilk önce okumak zorunda olmayan bir kuralı azaltabileceği durumlar. Bir kuralın azaltılması, bir sonraki belirteçten bağımsız olduğunda gerçekleşir.

Bu özel örnekte, integer kuralı için varsayılan bir azaltma kullanılabilir; bu nedenle, onu bulmaksızın düşürebilir, ancak yine de bir garanti yoktur; varsayılan indirimler, bazı (ancak tümü değil) uygulamaların kullandığı bir optimizasyondur. yacc.

+0

Bunun olup olmadığını öğrenmenin bir yolu var mı? –

+0

http://www.gnu.org/software/bison/manual/html_node/Default-Reductions.html, varsayılan azaltmaların anlamlarının tam bir açıklamasını içerir ve belirttiğiniz gibi, lexer'ın gecikmeli bir şekilde çağrılmasına neden olur. –

+0

Bazı bizon sürümlerinde, varsayılan bir azaltma olup olmadığınızı görmek için eylemde 'if (yychar == YYEMPTY)' seçeneğini işaretleyebilirsiniz (böylece hiç bir görünüm okunmamıştır), ancak bu çok taşınabilir değildir. –