1 回答

TA貢獻1834條經驗 獲得超8個贊
這是一個雙重問題:第一個可能是在getInlineParams
函數中簡化邏輯的方法,這對于這些簡單的情況可能沒有問題,但對于更復雜的情況可能會很糟糕。
第二個問題是完全無視類型。
{'{test}': coolFunctionWhichReturnsString('testParameter')}
被解析為(讀作“字符串值”-“令牌類型”):
{
- 阻止開始{test}
- 一個字符串:
- 標點符號coolFunctionWhichReturnsString
- 一個名字(
-(不確定是哪種類型)testParameter
- 一個字符串)
- (再次)}
- 塊結束
當您嵌套多個 {} 時,第一個問題將展開。第二個問題是由于一個簡單的事實:
該類型很重要。
詞法分析器有一項非常重要的任務,它刪除用戶可能選擇表達字符串、注釋的所有不同變體,它刪除不相關的空格(因為它只是雜亂無章)等等?,F在,如果你把每個Token
(有一個值和一個類型)當作只是一個包含你想要的字符串的奇怪對象,你就會遇到問題 - 很明顯。
因此,如果要重新創建類似于原始輸入的內容,則必須查看類型并在類型為字符串時添加引號。(文本可能是塊之外的所有東西)
(這將是您所述問題的快速“解決方案”)
但是,從長遠來看,忽略標記的語義會導致問題……因為您還必須以某種方式處理“coolFunctionWhichReturnsString”,即,您必須將其轉換為某個函數調用。從理論上講,您應該真正構建一個 AST 并在某個時候將其編譯成適當的形式......
樹枝解析器使用一種方法subparse
來解析內容,直到出現某個“結束”。(建立 AST,因為結構在某些時候也很重要)
更新:事實證明,在樹枝文檔中有一個用于編寫節點解析器的頁面,如果您遵循https://twig.symfony.com/doc/2.x/advanced.html,它可能會簡化很多#registering-a-new-tag(信息從略高于“注冊新標簽”開始,非常簡化了值的解析和使用)
- 1 回答
- 0 關注
- 232 瀏覽
添加回答
舉報