除了完成任何实际工作外,我还有一个痒。我的目的是编写一个视图引擎,它与另一种语言模板系统(Template Toolkit / Perl)非常相似。如果我有时间/做它来学习一些新的项目,那就是其中之一。

我花时间看CoCo / R和ANTLR,老实说,它让我的大脑受到伤害,但CoCo / R正在下沉。不幸的是,大多数例子都是关于创建一个读取源代码的编译器,但似乎没有涉及如何为模板创建处理器。

是的,这些都是一回事,但我无法解决如何定义模板的语言,其中大多数源是html,而不是实际的代码被解析和运行。

对于这种事情,有没有好的初学者资源?我已经在Spark上取得了一席之地,它似乎没有回购中的语法。

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

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

有帮助吗?

解决方案

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

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

标记规则是指在 CodeGrammar.cs - 这些是一个子集,因为Spark只需要识别足够的csharp来调整字符串周围的单引号为双引号,匹配curley braces等。

个别规则本身属于 ParseAction < !> LT; TValue <> GT!;代表接受职位并返回 ParseResult 。 ParseResult是一个简单的类,它包含由动作解析的TValue数据项和一个新的Position实例,该实例已经超出了产生TValue的内容。

在你引入少数运营商,如解析表达式语法中所述,它可以结合单个解析操作来构建关于不同语法结构形状的非常详细和强大的表达式。

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

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

其他提示

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

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.编写一个递归函数(称为解释器),它可以遍历您的树并在那里执行指令。

另一种替代方法(而不是步骤1--3)如果您的语言支持eval()(例如Perl,Python,Ruby):使用正则表达式替换将模板转换为eval() - 能够在主机语言,并运行eval()来实例化模板。

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

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

最后,我已经在ANTLR中花了太多时间来为loudejs提供方法。我想花更多的时间在整个过程而不是解析器/词法分析器上。也许在版本2中,当我的大脑更多地了解事物时,我可以采用Spark方式。

Vici Parser (以前称为LazyParser.NET)是一个开源软件令牌化器/模板解析器/表达式解析器,它可以帮助您入门。

如果它不是您想要的,那么您可以通过查看源代码获得一些想法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top