我現在有個 parsing tree 這樣,那 tree 就有 node 嘛,
因為我用的 yard parser,每一個 parsing rule 都是一個 class,
她的設計是有一個 abstract node,然後有 template node 去繼承 abstract node。
現在我想要加上 semantic action,
這樣的設計,這樣我可以透過 specialization 來特化每個 node<R> 的動作。
以圖來講就是這樣
↙ node <expr>
abs_node ← node <id>
↖ node <...>
以程式碼來說就是這樣
// Abstract Syntax Tree, 每一個 token 可能是很原始的 char,
// 也可以是被 lex 處理過的 int, 所以是 class template
template < typename T >
struct ast {
// abstract node
struct abs_node {
virtual void f () = 0 ; // semantic action, 純粹虛擬函數
} ;
} ;
// Abstract Syntax Tree, 每一個 token 可能是很原始的 char,
// 也可以是被 lex 處理過的 int, 所以用 template
template < typename T >
struct ast {
// abstract node
struct abs_node {
virtual void f () = 0 ; // semantic action
} ;
// 根據每個 parsing rule 繼承的 node
template < R >
struct node : abs_node {
void f () { act<R> () ; } // 實作 f(), 呼叫特化的 act<R>() 函數
} ;
} ;
那不過在這邊 act<R> 要被呼叫,當然在前面要先宣告嘛,
template < typename R >
void act () {} // generic 的版本,什麼都不做!
// Abstract Syntax Tree
template < typename T >
struct ast {
// abstract node
struct abs_node {
virtual void f () = 0 ; // semantic action
} ;
// 根據每個 parsing rule 繼承的 node
template < R > //
struct node : abs_node {
void f () { act<R> () ; } // 呼叫特化的 act<R>() 函數
} ;
} ;
// 在這邊特化,就可以處理想要處理的東西。
template<> void act<expr> () { ... }
template<> void act<id> () { ... }
但是,為了處理 node, act() 其實應該要接受 node 當作參數。
template < typename R >
void act ( ... ) { } // 靠北這邊我不會宣告 XD
// Abstract Syntax Tree
template < typename T >
struct ast {
// abstract node
struct abs_node {
virtual void f () = 0 ; // semantic action
} ;
// 根據每個 parsing rule 繼承的 node
template < R > //
struct node : abs_node { // 為了要處理node,
void f () { act<R> (this) ; } // 要把node自己傳進去!
} ;
} ;
對,問題就是這樣,我不知道那邊要怎麼宣告,哪個大師可以救我 QQ
或是不是設計成 function template,
設計成 class template 也可以,只要能符合這個設計就好 QQ
感恩。
--
To iterate is human, to recurse, divine.
遞迴只應天上有, 凡人該當用迴圈. L. Peter Deutsch
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.160.117.249
※ 編輯: yoco315 來自: 118.160.117.249 (04/15 01:58)
※ 編輯: yoco315 來自: 118.160.117.249 (04/15 01:58)
※ 編輯: yoco315 來自: 118.160.117.249 (04/15 01:58)