2012-03-21 70 views
0

我們有一個自定義C++模板引擎的網頁模板處理。讓我們說,我們有一個文件「的index.html」,內容如下:如何在模板引擎(預處理器)中模擬C邏輯和語法?

{% #include <stdio.h> %} 

<!doctype html> 
<html> 
    <head><title>{{ title }}</title></head> 
    <body> 
     {{ body }} 
     {% printf("test"); %} 
     {% printf("test2") %} 
     {% printf("test3"); %} 
     {% 
      printf("test4"); 
      printf("test5"); 
     %} 
     {% 
      printf("test6"); 
      printf("test7") 
     %} 
     {% printf("%d", isalpha('a')); %} 
    </body> 
</html> 

當模板引擎稱爲(初始化),它會掃描特定的「意見」文件夾中的所有文件。 「index.html」文件恰好在這個文件夾中。它被掃描並緩存在稱爲模板引擎的主程序的內存中。

請求被創建時,模板引擎的操作函數被調用。該函數採用緩存代碼陣列變量與他們的類型和值作爲參數,並返回恆定炭緩衝器與更新後的變量和邏輯運算的。爲了簡便起見,我們假定邏輯操作分別有{%...%}和變量{{...}}語法。

人們應該能夠使用C函數和通用邏輯中的標記語言。你甚至應該能夠在模板中定義函數。如果出現問題,變量或邏輯操作應該返回void。我們的最終結果與被稱爲「身體」「的index.html」網頁和「標題」爲變量{{體}}和{{title}}的分別應該是這樣的:

<!doctype html> 
<html> 
    <head><title>title</title></head> 
    <body> 
     bodytesttest3test4test5 
    </body> 
</html> 

如何有人模仿C語言的邏輯和語法嗎?這可能嗎?您是否需要儘可能開發一個定製的語言操作和函數調用庫或者是否有更簡單的解決方案?實施這種解決方案的最佳方式是什麼?

+0

這是瘋狂。 – blueshift 2012-03-21 10:38:28

+0

@blueshifr - 瘋狂?這是斯巴達。 – user1254893 2012-03-21 10:58:31

回答

1

有兩種方法。兩者都不容易實現。第一種稍微簡單的方法是從模板文件生成C,然後使用GCC等編譯器生成共享對象。這個共享對象可以用dlopen()/dlsym()加載,然後生成HTML代碼。

第二,更復雜,但更靈活的方法是實現一個解釋解釋「模板語言,」你可以在編譯器建設論文和書籍(龍書,例如)瞭解這一點。

當然,你也可以嘗試嵌入例如PHP解釋器,但有缺點,太。

「最佳方式」不存在。它高度依賴於你想要的東西。我想,我自己會執行翻譯。生成.so文件對我來說似乎「髒」。