問一個 C++ template 語法問題
我現在有個 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)
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章