6

我正在创建一种用于创建网页的脚本语言,但不知道从哪里开始。

我有一个看起来像这样的文件:


mylanguagename(main) {
       OnLoad(protected) {
              Display(img, text, link);
       }

       Canvas(public) {
              Image img: "Images\my_image.png";
                    img.Name: "img";
                    img.Border: "None";
                    img.BackgroundColor: "Transparent";
                    img.Position: 10, 10;

              Text text: "This is a multiline str#ning. The #n creates a new line.";
                   text.Name: text;
                   text.Position: 10, 25;

              Link link: "Click here to enlarge img.";
                   link.Name: "link";
                   link.Position: 10, 60;

                   link.Event: link.Clicked;
       }

       link.Clicked(sender, link, protected) {
              Image img: from Canvas.FindElement(img);
                    img.Size: 300, 300;
       }
}

...而且我需要能够使上面的文本以 Windows 脚本主机为目标。我知道这是可以做到的,因为不久前网上有很多文档,但我现在似乎找不到它们。

有人可以帮忙,还是让我朝着正确的方向开始?

谢谢

4

10 回答 10

5

您正在制作一种不存在的特定于领域的语言。你想翻译成另一种语言。您将需要一个合适的扫描仪和解析器。您可能被告知要查看 antlr。yacc/野牛,或黄金。那出了什么问题?

作为一个仅供参考,制作新语言是一个有趣的练习,但在你做这样的事情之前,你可能会问一个很好的坚实的“为什么?我的新语言提供了什么我无法获得任何其他(合理的)方式?”

于 2010-03-13T12:09:49.163 回答
3

关于解析和语言创建要理解的是,编写编译器/解释器主要是关于对输入文本进行的一组数据转换。

通常,您首先将输入文本翻译成一系列标记,每个标记代表您的语言中的一个概念或文字值。

然后,您通常会从令牌流中创建一个中间结构,通常是某种描述所编写代码的树结构。

然后可以出于各种原因验证或修改此树结构,包括优化。

完成后,您通常会将树写成其他形式 - 汇编指令甚至是另一种语言的程序 - 事实上,最早的 C++ 版本直接写出 C 代码,然后由常规 C 编译器编译根本不了解C++。因此,虽然跳过组装生成步骤可能看起来像是作弊,但它背后有着悠久而自豪的传统 :)

例如,我故意没有对特定库提出任何建议,因为了解整个过程可能比选择特定的解析器技术重要得多。从长远来看,您是否使用 lex/yacc 或 ANTLR 或其他东西都相当不重要。它们都会(基本上)工作,并且都已成功用于各种项目。

即使手动进行自己的解析也不是一个坏主意,因为它会帮助您了解如何完成解析的模式,因此使用解析器生成器往往更有意义,而不是成为巫毒的黑匣子.

于 2010-03-14T08:40:27.490 回答
2

类似于 C# 的语言不容易解析 - 有一些自然的左递归规则。因此,您必须使用可以正确处理它们的解析器生成器。ANTLR 非常适合。

如果 PEG 更适合,试试这个:http ://www.meta-alternative.net/mbase.html

于 2010-03-13T21:35:05.713 回答
1

所以你想把 C# 程序翻译成 JavaScript?Script#可以为您做到这一点。

于 2010-03-13T11:51:32.447 回答
1

假设你真的致力于做到这一点,这就是要走的路。这通常是你应该做的:source -> SCANNER -> tokens -> PARSER -> syntax tree

1)创建一个扫描仪/解析器来解析你的语言。您需要编写一个语法来生成一个可以扫描/解析您的语法的解析器,以标记/验证它们。

我认为这里最简单的方法是使用 Irony,这样可以快速轻松地创建解析器。这是一个很好的起点

http://www.codeproject.com/KB/recipes/Irony.aspx

2) 构建语法树 - 在这种情况下,我建议您构建一个简单的 XML 表示而不是实际的语法树,以便您以后可以遍历 DOM 的 XML 表示以吐出 VB/Java 脚本。如果您的要求很复杂(比如您想编译它左右),您可以创建 DLR 表达式树或使用代码 DOM - 但我想我们在这里谈论的是翻译器,而不是编译器。

但是,等等 - 如果不是出于教育目的,请考虑从一开始就将您的“脚本”表示为 xml,这样您就可以避免在中间使用扫描仪/解析器,然后再吐出一些 VB/Java 脚本/Html那。

于 2010-03-23T11:55:00.853 回答
1

与其编写自己的语言然后运行翻译器将其转换为 Javascript,不如扩展 Javascript 来做你想做的事?

看看 jQuery——它以非常自然和流畅的语法以许多强大的方式扩展了 Javascript。这几乎和拥有自己的语言一样好。看看人们也为它创建的许多扩展,尤其是 jQuery UI。

于 2010-03-13T23:22:20.260 回答
0

您显然需要设计用于翻译语言的机器:解析、树构建、模式匹配、目标语言树构建、目标语言漂亮打印。您可以尝试使用 YACC(或等效项)来完成所有这些工作,但您会发现解析只是完整翻译器的一部分。这意味着除了解析之外还有很多工作要做,这需要时间和精力。

我们的DMS 软件再造工具包是一种商业解决方案,可以以相对适中的成本构建完整的翻译人员。

如果你想从头开始自己做一个练习,那很好。只需为真正需要的努力做好准备。

最后一句话:如果你想得到一个好的结果,设计一门完整的语言是很困难的。

于 2010-03-13T21:32:42.407 回答
0

就我个人而言,我认为每一个自我强加的挑战都是好的。我确实同意其他观点,即如果您想要的是对现实生活问题的真正解决方案,那么坚持使用经过验证的解决方案可能会更好。但是,如果正如您自己所说,您对解决这个问题有学术兴趣,那么我鼓励您继续。如果是这种情况,我可能会指出一些提示让您走上正轨。

解析并不是一件容易的事,我们至少要花一个学期的时间。不过,是可以学习的。我建议从 Terrence Parr 关于语言实现模式的书开始。有很多关于编译和解析的好书,最喜欢和最讨厌的可能是《龙书》

这是相当沉重的东西,但如果你真的很喜欢这个,并且有时间,你一定要看看。这将是罗比森漂流记的“我会自己做这一切的方法”。我最近写了一个 LR 解析器生成器,我只花了一个长周末,但是在阅读了很多内容并参加了完整的两个学期的编译器课程之后。

如果您没有时间或者只是不想学习“像男人一样”制作解析器,那么您可以随时尝试商业或学术解析器生成器。ANTLR很好,但你必须学习它的元语言。我个人认为Irony是一个很棒的工具,特别是因为它保留在 C# 中,您可以查看源代码并自己学习。因为我们在这里,而且我根本不想做任何广告,所以我在 CodePlex 中发布了一个可能对这项任务有用的小工具。自己看一下,它是开源且免费的。

作为最后一个提示,如果有人告诉您无法完成,请不要害怕。解析是一个困难的理论问题,但它没有什么是学不来的,它确实是你投资组合中的一个很好的工具。我认为开发人员可以手动编写下降递归解析器,即使他从来不需要这样做,这说明了他的优点。如果你想实现这个目标,请参加大学级别的编译器课程,一年后你会感谢我的。

于 2012-04-04T20:10:05.010 回答
0

我不想变得粗鲁……但你为什么要这样做?

为常规语言创建解析器并非易事。只是不要这样做。

你为什么不直接使用 html、javascript 和 css(以及上面有人建议的 jquery)

如果您不知道从哪里开始,那么您可能没有任何此类经验,并且您可能没有充分的理由,为什么要这样做。

我想为你省去痛苦。忘了它。这可能是一个坏主意!

M。

于 2010-03-23T03:21:52.237 回答
0
  1. 查看为小语言构建语言处理器。我相信这是一个非常好的介绍。事实上,当我在使用模板语言解析器时遇到问题时,我刚刚在 2 天前查阅了我的副本。

  2. 尽可能使用 XML。如果你想在生产中使用这个东西,你不想手动摆弄词法分析器和解析器。这个错误我已经犯过几次了。你最终会支持你真的不应该支持的代码。看来您的语言主要是模板语言。XML 在那里工作得很好。正如 ASPX 文件是 XML 一样。您的服务器端块可以用 Javascript 编写,必要时进行修改。如果这是一个学习练习,那么一定要手工完成。

我认为编写自己的语言是一项很棒的练习。参加大学水平的编译器写作课程也是如此。祝你好运。

于 2010-03-23T03:47:07.527 回答