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
%union
bildirimi, yylval
türünü değiştirir.
bison
manuel: sıradan (nonreentrant) ayrıştırıcı olarak
, belirtecin semantik değeri küresel değişkenyylval
içine depolanmalıdır. Semantik değerler için sadece bir veri tipi kullandığınızda,yylval
bu türe sahiptir. tipint
(varsayılan) ise Böylece, senyylex
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. */ ...
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ü.
Neden bir öğenin birleşimini tanımlar? Neden sadece #Yeni YYSTYPE sınıfı ASTNode * 'yi değil (eğer bellek çalışırsa). –