2016-11-10 77 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