leex是编写模板引擎词法分析器的好选择吗?

时间:2016-11-10 23:22:50

标签: erlang elixir template-engine lexical-analysis leex

我正处于为Elixir实现类似jinja2的模板语言的初始设计阶段。我一直倾向于手工编写词法分析器,但我最近遇到了Erlang的leex模块。它看起来很有希望,但经过一些初步研究后,我不确定它是否适合我的目的。

我的犹豫之一是模板语言本质上是一种字符串嵌入式语言,目前尚不清楚如何使用leex来为这种情况使用tokenize。作为一个简单的例子,想象一下这个模板的标记:

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

在此示例中,我需要确保根据以下内容对kewords' for '和' in '进行不同的标记:

  • 如果它们位于代码中: {%}}
  • 如果它们位于代码中: {{}}
  • 如果它们在模板中,但不在任何标签内。

对我而言,这似乎需要在标记化阶段进行两次传递,或者滚动我自己的词法分析器以便在一次传递中执行此操作。

我想知道是否有任何具有词法分析经验的人,尤其是leex,或者编写模板引擎,是否可以提供一些有关最佳前进方法的见解?

1 个答案:

答案 0 :(得分:3)

如果这对我没有帮助,请提前道歉,但我认为词法分析具有正则表达的力量,因此,我怀疑你想要做的不是甜蜜的 - RE或Leex的现场。第一步是从源代码转到词汇元素(标记),这些元素大部分都缺乏上下文,并且适合使用Leex。

我认为处理FOR和IN标记的不同上下文敏感语义将通过解析和Erlang的Yecc来处理。您可能能够在词法分析阶段处理评论,但我认为通常您可以使用Leex和Yecc的组合。