[英]Bison: How $ variables ($1 $2 etc) work with non-tokens?
我想知道$變量如何與非令牌(如代碼塊)一起使用。 我的問題可以簡化為:
我有這樣一條規則,中間有一段代碼。 在這種情況下,誰是3美元和4美元?
func-header: ret-type ID { strcpy(func_id,current_id); } LPAREN params RPAREN
中規則動作(MRA)被實現為與空序列匹配的非終端。 (這種非終結符有時也稱為“標記”。)中規則操作是生成的非終結符的語義操作。
像任何非終結符一樣,這些自動生成的標記具有語義值,該語義值是通過在操作內分配$$
來設置的。 但是,MRA中$n
的編號與正常操作中的編號略有不同。 在MRA內部, $n
每個n
都會轉換為一個負索引,通過減去MRA自己的索引,表示減少標記時堆棧頂部的值。
yacc / bison始終允許使用負索引,但是根據手冊中的說明,它們非常危險,只有在您可以證明必須在棧中的指示點上鍵入適當類型的值時,才應使用負索引。 在自動生成的標記的情況下,yacc /野牛可以證明這一點,因為標記僅用於單個生產中,並且生成的負索引始終落入堆棧中被包含MRA的右側占據的部分。
在顯示的規則中:
ret-type
是$1
。 ID
為$2
。 $3
。 LPAREN
為$4
。 params
是$5
。 RPAREN
為$6
。 換句話說,代碼塊充當非終端。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.