1

我正处于为 Elixir 实现类似 jinja2 的模板语言的初始设计阶段。我一直倾向于手动编写词法分析器,但最近我遇到了 Erlang 的 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 %}

在此示例中,我需要确保关键字 ' for ' 和 ' in ' 的标记不同,具体取决于:

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

对我来说,这看起来我需要在标记化阶段进行两次传递,或者滚动我自己的词法分析器以便一次完成。

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

4

1 回答 1

3

如果这没有帮助,请让我提前道歉,但我认为词法分析具有正则表达式的力量,因此,我怀疑您正在尝试做的事情不在 RE 或 Leex 的最佳位置. 第一步是从源代码到词法元素(标记),这将大部分没有上下文,并且是对 Leex 的适当使用。

我认为处理你的 FOR 和 IN 标记的不同的、上下文相关的语义将通过解析和 Erlang 的 Yecc 来处理。您可能能够在词法分析阶段处理注释,但我认为通常您可能会使用 Leex 和 Yecc 的组合。

于 2016-11-11T20:04:30.993 回答