0

除了完成任何真正的工作外,我还很痒。我的渴望是编写一个视图引擎,它可以从另一种语言(模板工具包/Perl)中紧密模仿模板系统。如果我有时间/做它来学习一些新的项目,这就是其中之一。

我花了一些时间研究 CoCo/R 和 ANTLR,老实说,这让我很头疼,但是一些 CoCo/R 正在陷入困境。不幸的是,大多数示例都是关于创建一个读取源代码的编译器,但没有一个似乎涵盖了如何为模板创建处理器。

是的,这些是相同的,但我无法理解如何为模板定义语言,其中大部分源代码是 html,而不是解析和运行的实际代码。

这种事情有没有好的初学者资源?我在 Spark 上做了一个 ganer,它似乎在 repo 中没有语法。

也许这太过分了,人们可以在文件中用 c# 测试替换模板语法并编译它。http://msdn.microsoft.com/en-us/magazine/cc136756.aspx#S2

如果你在我的鞋子里并且不是语言创造专家,你会从哪里开始?

4

4 回答 4

3

Spark 语法是用一种流利的领域特定语言实现的。

它在几层中声明。识别 html 语法的规则在MarkupGrammar.cs中声明——这些规则基于直接从 xml 规范复制的语法规则。

标记规则是指CodeGrammar.cs中声明的 csharp 语法规则的有限子集- 这些是一个子集,因为 Spark 只需要识别足够的 csharp 即可将字符串周围的单引号调整为双引号、匹配花括号等。

各个规则本身属于ParseAction<TValue> 委托类型,它接受一个Position并返回一个ParseResult。ParseResult 是一个简单的类,它包含由操作解析的 TValue 数据项和一个新的 Position 实例,该实例已经超过了产生 TValue 的内容。

在您引入少量运算符之前,它本身并不是很有用,如解析表达式语法中所述,它可以组合单个解析动作来构建关于不同语法结构形状的非常详细和健壮的表达式。

使用委托作为解析操作的技术来自 Luke H 的博客文章Monadic Parser Combinators using C# 3.0。我还写了一篇关于为解析创建域特定语言的帖子。

如果您愿意,也完全可以引用 Spark.dll 程序集并从基础 CharGrammar 继承一个类,从而为特定语法创建全新的语法。这可能是开始试验这种技术的最快方法,可以在CharGrammarTester.cs中找到一个示例。

于 2009-05-10T08:44:41.090 回答
0

步骤 1. 使用正则表达式(正则表达式替换)将您的输入模板字符串拆分为令牌列表,例如 split

hel<b>lo[if foo]bar is [bar].[else]baz[end]world</b>!

write('hel<b>lo')
if('foo')
write('bar is')
substitute('bar')
write('.')
else()
write('baz')
end()
write('world</b>!')

步骤 2. 将您的标记列表转换为语法树:

* Sequence
** Write
*** ('hel<b>lo')
** If
*** ('foo')
*** Sequence
**** Write
***** ('bar is')
**** Substitute
***** ('bar')
**** Write
***** ('.')
*** Write
**** ('baz')
** Write
*** ('world</b>!')

class Instruction {
}
class Write : Instruction {
  string text;
}
class Substitute : Instruction {
  string varname;
}
class Sequence : Instruction {
  Instruction[] items;
}
class If : Instruction {
  string condition;
  Instruction then;
  Instruction else;
}

步骤 3. 编写一个递归函数(称为解释器),它可以遍历您的树并在那里执行指令。

如果您的语言支持 eval()(例如 Perl、Python、Ruby),另一种替代方法(而不是步骤 1--3):使用正则表达式替换将模板转换为宿主语言中支持 eval() 的字符串,然后运行 ​​eval() 来实例化模板。

于 2009-05-01T20:32:33.723 回答
0

有太多事情要做。但它确实适用于简单的 GET 语句和测试。这是一个开始。

http://github.com/claco/tt.net/

最后,我在 ANTLR 中已经有太多时间来尝试 Loudejs 的方法了。我想在整个过程而不是解析器/词法分析器上多花一点时间。也许在第 2 版中,当我的大脑对事物了解更多时,我可以尝试使用 Spark 方式。

于 2009-05-28T13:32:10.493 回答
0

Vici Parser(以前称为 LazyParser.NET)是一个开源的分词器/模板解析器/表达式解析器,可以帮助您入门。

如果这不是您要查找的内容,那么您可能会通过查看源代码获得一些想法。

于 2009-05-28T13:42:35.730 回答