簡體   English   中英

野牛:$變量($ 1 $ 2等)如何與非令牌一起使用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM