2009-12-05 46 views
14

Yacc dosyasında birliğin amacı nedir? Esnek dosyada yylval ile doğrudan ilişkili mi? Eğer yylval kullanmıyorsan, sendikayı kullanmana gerek yok mu?yylval ve union

cevap

11

%union bildirimi, yylval türünü değiştirir.

explains bison manuel: sıradan (nonreentrant) ayrıştırıcı olarak

, belirtecin semantik değeri küresel değişken yylval içine depolanmalıdır. Semantik değerler için sadece bir veri tipi kullandığınızda, yylval bu türe sahiptir. tip int (varsayılan) ise Böylece, sen yylex bu yazabiliriz:

... 
yylval = value; /* Put value onto Bison stack. */ 
return INT;  /* Return the type of the token. */ 
... 

Birden veri türlerini kullanırken, yylval 'ın tip %union ilanı yapılmış bir birlik (bkz bölüm olduğunu Değer Türlerinin Toplanması. Yani bir jetonun değerini sakladığınızda, birliğin uygun üyesini kullanmalısınız. %union beyan bu gibiyse

%union { 
    int intval; 
    double val; 
    symrec *tptr; 
} 

sonra yylex kod şöyle olabilir:

... 
yylval.intval = value; /* Put value onto Bison stack. */ 
return INT;   /* Return the type of the token. */ 
... 
21

union amacı yayılan düğümler halinde nesnelerin farklı tür depolama izin vermektir flex tarafından.

örneğin olabilir daha iyi açıklamak için: .y yılında

%union 
{ 
    int intValue; 
    float floatValue; 
    char *stringValue; 
} 

Eğer int, float ve string türleri için temel destek sağlamak istiyorum. Bununla ne yapabilirsin?

İki şey: belirteçleri oluşturulurken

Önce, otomatik doğru değerleri ayarlayabilirsiniz. Önceki örnekte yaklaşık .l dosyasını düşünün, sen sahip olabilir:

[a-zA-Z][a-zA-Z0-9]* { 
yylval.stringValue = strdup(yytext); 
return IDENTIFIER; 
} 

[0-9]+ { 
yylval.intValue = atoi(yytext); 
return INTEGER; 
} 

[0-9]*\.[0-9]+"f"? { 
    yylval.floatValue = new atof(yytext); 
return FLOAT; 
} 

Eğer esnek dilbilgisi doğrudan değerini kullanabilir ek olarak: Eğer bir OOP sözdizimi kullanmayı planlıyorsanız Nihayet

nexp: nexp '+' nexp { $<floatValue>$ = $<floatValue>1 + $<floatValue>3 } 

%union 
{ 
    class ASTNode *node; 
} 

hangi ASTNode içinde s her türlü atası sınıftır olarak ağacı birliği tanımlayabilirsiniz yntax düğümü.

+3

Neden bir öğenin birleşimini tanımlar? Neden sadece #Yeni YYSTYPE sınıfı ASTNode * 'yi değil (eğer bellek çalışırsa). –