Mục đích của nghiệp đoàn trong tệp yacc là gì? Nó có liên quan trực tiếp đến yylval trong tập tin flex? Nếu bạn không sử dụng yylval, sau đó bạn không cần phải sử dụng công đoàn?yylval và union
Trả lời
Tuyên bố %union
sửa đổi loại yylval
.
Các bison
thủ explains:
Trong một (nonreentrant) thường phân tích cú pháp, giá trị ngữ nghĩa của các dấu hiệu phải được lưu trữ vào biến toàn cầu
yylval
. Khi bạn đang sử dụng chỉ một loại dữ liệu cho các giá trị ngữ nghĩa,yylval
có loại đó. Như vậy, nếu loại làint
(mặc định), bạn có thể viết những dòng này trongyylex
:... yylval = value; /* Put value onto Bison stack. */ return INT; /* Return the type of the token. */ ...
Khi bạn đang sử dụng nhiều loại dữ liệu, loại
yylval
's là một sự kết hợp làm từ việc kê khai%union
(xem phần Các Bộ sưu tập các loại giá trị). Vì vậy, khi bạn lưu trữ giá trị của một mã thông báo, bạn phải sử dụng thành viên thích hợp của công đoàn. Nếu việc kê khai%union
trông như thế này:%union { int intval; double val; symrec *tptr; }
sau đó các mã trong
yylex
có thể trông như thế này:... yylval.intval = value; /* Put value onto Bison stack. */ return INT; /* Return the type of the token. */ ...
Mục đích của union
là cho phép lưu trữ loại khác nhau của các đối tượng vào các nút phát ra bởi flex.
Để giải thích rõ hơn bạn có thể có ví dụ:
%union
{
int intValue;
float floatValue;
char *stringValue;
}
trong .y
nếu bạn muốn cung cấp hỗ trợ cơ bản cho int
, float
và string
loại. Bạn có thể làm gì với điều này?
Hai điều:
Trước tiên, bạn có thể tự động đặt giá trị phù hợp khi tạo mã thông báo. Hãy suy nghĩ về .l
tập tin của ví dụ trước, bạn có thể có:
[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;
}
Bên cạnh đó bạn có thể sử dụng giá trị trực tiếp trong bạn flex ngữ pháp:
nexp: nexp '+' nexp { $<floatValue>$ = $<floatValue>1 + $<floatValue>3 }
Cuối cùng nếu bạn có kế hoạch để sử dụng một cú pháp OOP cây bạn có thể xác định công đoàn là
%union
{
class ASTNode *node;
}
trong đó ASTNode
là lớp tổ tiên của bất kỳ loại nào nút yntax.
- 1. tr1 :: unordered_set union và intersection
- 2. UNION ALL và LIMIT trong MySQL
- 3. SqlException về UNION, INTERSECT và EXCEPT
- 4. PostgreSQL lồng nhau CTE và UNION
- 5. MYSQL UNION DISTINCT
- 6. Array Merge (Union)
- 7. UNION to JPA Query
- 8. HiveQL UNION ALL
- 9. Chọn từ union tsql
- 10. SELECT UNION và ORDER BY trong mysql .. làm thế nào?
- 11. Kết hợp UNION ALL và ORDER BY trong Firebird
- 12. Bảng Concat/Union trong LINQ
- 13. Mysql UNION and GROUP BY
- 14. Truy vấn UNION chậm - MySQL
- 15. Cú pháp UNION trong Cakephp
- 16. Cách sử dụng Union in Linq Query
- 17. Danh sách LINQ <string> union
- 18. Cách viết UNION trong Doctrine 2.0
- 19. OPTIMIZE FOR UNKNOWN khi thực hiện UNION
- 20. mysql union số cột khác nhau
- 21. Hiệu suất D: union vs @property
- 22. Lỗi cú pháp trong MySQL gần UNION?
- 23. mysql union vs nhiều truy vấn
- 24. Cách sử dụng union trong zend db
- 25. T-SQL UNION Trên 3 Bàn?
- 26. Kết hợp UNION và các hoạt động LIMIT trong truy vấn MySQL
- 27. C++ union để đại diện cho bộ nhớ dữ liệu và loại biến vô hướng C
- 28. SQL chọn đa dạng các mục trong union
- 29. Câu lệnh SQL Case VS Union Tất cả hiệu suất
- 30. SQL ORDER BY with CASE with UNION ALL
Tại sao xác định một liên kết của một phần tử? Tại sao không chỉ '#define YYSTYPE class ASTNode *' (nếu bộ nhớ phục vụ). –