2013-06-19 19 views
0

我在寫一個樹枝標籤,我想告訴Tokenizer標籤第一個參數是常量而不是表達式。樹枝,解析器,僅字符串(禁止表達式)

對於例如,可以說我的標籤是 「回聲」 的別名:

{% tagname 'toto' %} 

應該產生 「TOTO」(不含引號)

{% tagname toto %} 

也應該產生 「TOTO」(不包括引號)

{% tagname toto.xx %} 

應該產生 「toto.xx」(不含引號)

問題出現在最後一個例子中,Token解析器認爲「toto」是一個表達式,因此查找一個名爲「toto」的變量。

所以我想知道是否有可能以某種方式指定標記參數必須是一個常量?

我的代碼看起來像現在:

public function parse(\Twig_Token $token) 
{ 
    $parser = $this->parser; 
    $stream = $parser->getStream(); 
    $text = $parser->getExpressionParser()->parseStringExpression(); 

我也試過parsePrimaryExpression,parseHashExpression從ExpressionParser(是錯誤?)

在此先感謝

+0

你是什麼意思?一個PHP常量? –

+0

是否有一個特別的原因,你希望樹枝解析表達式的字符串......這對我來說並不合適。塊標籤使用類似的東西,也許你應該看看那個。 – nifr

+0

我知道這看起來很奇怪:現在,我們得到了一個使用了很多preg_ *的DSL。爲了可維護性目的,我試圖將它轉換爲樹枝。 DSL被最終用戶所使用,我不想用「這不是一個有效的字符串語法」來打擾他們,並且比樹枝更寬容。但是,如果這是不可能的,我可能會保留舊的東西正則表達式:(。 – cyqui

回答

0

如果我理解你正確地,你想同時使用{% sometag 'foo' %}{% sometag foo %}

這是在詞法分析器中完成的,SometagTokenParser。有報價的那個叫Twig_Token::STRING_TYPE,沒有引號的那個是Twig_Token::NAME_TYPE。在你的令牌解析器中使用類似的東西:

if ($stream->test(\Twig_Token::NAME_TYPE)) { 
    $name = $stream->expect(\Twig_Token::NAME_TYPE)->getValue(); 
} else { 
    $name = $stream->expect(\Twig_Token::STRING_TYPE)->getValue(); 
} 

兩者都只是在應用程序的其餘部分作爲字符串處理。

支持tuto.foo沒有引號是不可能在枝條中。

+0

好的,但如果」參數「是」toto.xx「,那麼,只有一次調用」expect「作爲toto,我纔會得到」toto「 xx是兩個令牌,好像我不能循環令牌,因爲第三個令牌是第二個參數(toto.xx argument2)。你看到了解決方案嗎?我覺得我最終沒有樹枝 – cyqui

+0

''toto .xx「'是一個令牌(STRING_TYPE),'toto。xx'是2令牌 –

+0

問題是我可能有像URL這樣的參數,並仍然在爲最終用戶使用DSL的角度來看,我不能要求他們在其周圍加引號。謝謝你的時間想法:) – cyqui