yacc文件中union的用途是什麼?它是否與flex文件中的yylval直接相關?如果你不使用yylval,那麼你不需要使用union?yylval和union
14
A
回答
11
%union
聲明修改yylval
的類型。
的bison
手冊explains:
在普通的(不可重入)分析器,令牌的語義值必須被存儲到全局變量
yylval
。如果僅爲語義值使用一種數據類型,則yylval
具有該類型。因此,如果類型爲int
(默認),你可能會這樣寫在yylex
:當您使用多種數據類型... yylval = value; /* Put value onto Bison stack. */ return INT; /* Return the type of the token. */ ...
,
yylval
的類型與%union
聲明作出了工會(見的價值類型的集合)。所以當你存儲一個令牌的值時,你必須使用聯合的正確成員。如果%union
聲明如下所示:%union { int intval; double val; symrec *tptr; }
然後在
yylex
代碼可能是這樣的:... yylval.intval = value; /* Put value onto Bison stack. */ return INT; /* Return the type of the token. */ ...
21
的union
的目的是允許存儲不同類型的對象到發射節點通過flex。
更好地說明你可以有例如:
%union
{
int intValue;
float floatValue;
char *stringValue;
}
在
.y
,如果你想爲int
,float
和string
類型提供了基本的支持。你能用這個做什麼?
兩件事情:
首先,你可以生成令牌時自動設置正確的價值觀。想想.l
文件前面的例子中,你可以有:
[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;
}
此外,您可以直接在柔性語法使用值:
nexp: nexp '+' nexp { $<floatValue>$ = $<floatValue>1 + $<floatValue>3 }
最後,如果你打算使用OOP語法樹可以定義爲工會
%union
{
class ASTNode *node;
}
其中ASTNode
是父類中的任何一種的S的yntax節點。
相關問題
- 1. 爲什麼yylval null?
- 2. 'yylval'的flex和bison衝突類型
- 3. Linq Union和Take
- 4. SQL UNION總和
- 5. mysql innerjoin和union
- 6. 與UNION和ORDER BY
- 7. MYSQL UNION和/或PIVOT
- 8. UNION JOIN和MS-ACCESS
- 9. UNION和BETWEEN日期
- 10. SQL UNION和ORDER BY
- 11. Mysql UNION和GROUP BY
- 12. 創建SELECT和UNION
- 13. 如何在flex中使用yylval
- 14. 野牛語法:yylval嵌入yyparse
- 15. 未定義的yylval使用Flex和野牛
- 16. LINQ Union vs SQL Union
- 17. UNION
- 18. UNION ALL和SQL合併
- 19. 結合了SELECT和UNION ALL
- 20. Typescript Union類型和接口
- 21. UNION ALL和從2個表
- 22. PostgreSQL嵌套CTE和UNION
- 23. 大表格和UNION表演
- 24. UNION和子查詢(MySQL)
- 25. SQL:While和Union統一SELECTs
- 26. 帶有負INTERSECT和UNION
- 27. UNION和ORDER BY在MySQL
- 28. SQL:級聯UNION和JOIN
- 29. 使用UNION ALL和INNER JOIN
- 30. mysql離開join和union?
爲什麼要定義一個元素的聯合?爲什麼不只是'#define YYSTYPE class ASTNode *'(如果內存服務)。 –