2016-11-10 62 views
1

我正在爲Elixir實現類似jinja2的模板語言的初始設計階段。我一直傾向於手動編寫詞法分析器,但最近我遇到了Erlang的leex模塊。它看起來很有前途,但經過一些最初的研究後,我不確定它是否適合我的目的。leex是編寫模板引擎詞法分析器的好選擇嗎?

我的一個猶豫是一種模板語言,實質上是一種字符串嵌入式語言,但不清楚如何使用leex在這種情況下使用標記化。作爲一個簡單的例子,假設令牌化這個模板:

<p>Here is some text for inclusion in the template.</p> 
{% for x in some_variable %} 
    The value for the variable: {{ x }}. 
{% endfor %} 

在這個例子中,我需要確保kewords「」和「在」的切分不同,這取決於:

  • 如果他們是一個標籤中:{%}
  • 如果他們是一個標籤中:{{}}
  • 如果它們在模板中,但不在任何標籤內。

對我來說,這看起來好像我需要在令牌化階段做兩遍,或者滾動我自己的詞法分析器,以便一次完成。

我想知道是否任何有詞法分析經驗的人,特別是leex或者寫模板引擎能夠提供一些洞察最好的前進方向?

回答

3

如果這對我沒有任何幫助,請讓我道歉,但我認爲詞法分析具有正則表達的力量,因此,我懷疑你所要做的並不在甜蜜點中的RE或Leex。首先通過從源代碼到詞彙元素(令牌),這些元素大多缺乏上下文,並且將是Leex的適當使用。

我認爲你的FOR和IN令牌的不同的,上下文敏感的語義的處理將通過解析和Erlang的Yecc處理。您可能能夠在詞法分析階段處理評論,但我認爲一般情況下您可以使用Leex和Yecc的組合。

+0

好點,屬於解析階段而不是標記化階段。感謝您的澄清;我認爲你是對的。詞法分析器不應該知道任何標記的含義或代表。 – suprafly