解析提示

时间:2009-08-28 12:07:34

标签: parsing templates

我想实现像Template Toolkit这样的最小模板语言,但更简单。 我不想使用现有的实现/库,但是从头开始,因为我想从中学到一些东西,我想完全理解它,以便根据我的需要采用它。 最终产品应该是C,但我可能会尝试首先在Perl中制作原型。 一开始我只希望它处理包括其他文件,替换变量,现在是困难的部分,如果/ elseif / else / endif-constructs需要一些高级解析,可任意嵌套。

以下是一个说明其用途的示例:

<h1>[% substitute title %]</h1>
<p>
[% if foo %]
foo is true
[% elseif bar %]
[% if baz %]
bar and baz are true
[% endif %]
bar is true
[% else %]
<em>none<em> is true
[% endif %]
</p>

我有很好的C和一些Perl技能,但绝对没有解析知识,所以我甚至不知道我到底在找什么。 所以我会对

感兴趣
  • 哪些算法可以像这样处理解析
  • 阅读有关此类算法的建议,对此处相关解析的最小介绍或教程
  • 最小,记录良好/评论的例子(我从TT来源无法理解)

TIA。

3 个答案:

答案 0 :(得分:1)

如果你正在使用C,请尝试(f)lex和yacc / bison。它们并不难以使用。

此外,有关SO编译器基础知识的几个问题。

基本要点:

第一步是将字符流转换为令牌流。

例如[%和%]是两个令牌。但标识符也是一种标记。

下一步是检测并执行语法。您可以通过构建语法树来完成此操作:

              [if]
             /  | \
            /   |  \
            |  Exp  |
            |   |   |
            |  foo  |
            |       |
      "foo is.."    elsif
                   / | \
                  /   |  \
                  |  Exp  |
                  |   |   |
                  |  bar  |
                  |       |
                  if      "none is true"
                /  | \
               /   |  \
               |  Exp  |
               |   |   |
               |  baz  |
               |       |
      "bar and..."    empty

执行树。这意味着:对于每个(else)if节点,计算表达式,如果为true则执行true分支,如果为false则执行fase分支。

答案 1 :(得分:0)

我曾在一段时间之前写过类似question的一般答案。希望,它可以帮助你找到一些起点。

答案 2 :(得分:0)

JavaCC是Java编译器编译器,它用于在java中编译。如果你想编写一门编程语言或翻译,可以使用相当多的软件。