我想实现像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技能,但绝对没有解析知识,所以我甚至不知道我到底在找什么。 所以我会对
感兴趣TIA。
答案 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中编译。如果你想编写一门编程语言或翻译,可以使用相当多的软件。