【问题标题】:Creating a scripting language to be used to create web pages创建用于创建网页的脚本语言
【发布时间】:2026-01-03 01:35:02
【问题描述】:

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

我有一个如下所示的文件:


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 脚本主机为目标。我知道这是可以做到的,因为不久前网上有很多文档,但我现在似乎找不到它们。

有人可以帮忙,或者让我朝着正确的方向开始吗?

谢谢

【问题讨论】:

  • 为什么这被否决了?

标签: c# wsh scripting-language


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。这对我来说只是一个练习。我明白这是一个相当长的学习曲线,但这是我一直想做的事情,我想有很多语言可以满足我的需求,但我对其他语言有很多抱怨,我只想自己创建一个,因为至少那时我可以添加/删除/修改功能等。
  • @BenjaminCox 确实是。几周后我放弃了。但我现在又回来了,有了更多的经验。祝我好运!
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

  • 非常感谢您的回答 kyoryu :)。您能否建议任何可以帮助我开始手动解析内容的参考/链接?
【解决方案3】:

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

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

【讨论】:

  • 左递归并不难解析。 LR 解析器一直在处理这个问题。 (我使用 GLR 而不是 LR 构建了一个完整的 C# 4.0 解析器 [因为它甚至比 LR 更容易!] 但是除了那些形成列表的规则之外,没有任何规则是递归的。列表形成规则很容易处理每个我见过的解析器生成器。
  • 是的,如果您使用的是解析器生成器,那就是真的。但这不是默认选项——通常人们会期望一个手写的递归下降解析器。当类 C# 的语法不是 DSL 的最佳选择时,情况正是如此。当然,如果您知道自己在做什么,这很容易处理。如果这是您的第一个 DSL,则不会。至于左递归规则: expr = expr 。方法 ( ...) | expr [ 索引 ] |表达式。领域 | ... - 它们是 C++ 语法的邪恶方面。当然,除非你有 GLR。并感谢 -1 :)
  • P.S.当然,我上面提到的规则不需要递归,除非你想实际使用生成的语法树。如果它只是您所追求的解析和漂亮打印,则可以使它们右递归。
  • 通常人们会使用手写的递归下降解析器?不是在 2010 年。期望是尽可能多的自动化,甚至您建议使用 ANTLR 和 PEG。至于“邪恶”左递归,LALR/LR/GLR 都可以很好地完成您的示例。对于 LL,expr = expr A | expr = expr B 被简单地重构为 expr = expr ( A | B)。我不明白,这些都不难。
  • 我使用(并实现)解析器生成器。你也这样做。但是您肯定忘记了“正常”人第一次遇到解析问题时会做什么。我试图说服许多人使用 ANTLR 或类似技术——但失败了。在 2009-2010 年,是的。我知道你的业务都是关于解析的(我的也是如此),所以你的观点肯定是有偏见的。这对你来说并不难——对于那些以前从未实现过中缀算术的人来说也很难。是的 - 它肯定是“微不足道的重构” - 代价是更复杂的语法树,需要额外的转换才能使用。
【解决方案4】:

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

【讨论】:

  • 有点。我写的上面的代码就像一个原型。它实际上不是 c#,它是我自己的语言。我希望能够按照上面的方式进行编码,然后将其转换为 Javascript。
  • (只是为了防止混淆)我将 c# 作为标签的原因仅仅是因为我想在 c# 中为我的这种新语言创建一个解析器。 (如果这种类型的事情需要解析器。)
  • 为什么要开发一门新语言?没有适合您的需求吗?
  • 你想达到什么目标?您的示例表明您在代码中大量嵌入数据 - 为什么要这样做而不是从数据库或 XML 文件等数据存储中获取数据?
  • 这将是一种可用于创建网页的脚本语言。 :)
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

    假设您真的致力于此,这就是要走的路。这通常是你应该做的: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 出来了。

    【讨论】:

    • 感谢您的回答 amazedsaint!非常感谢;)
    【解决方案7】:

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

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

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

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

    我想为你减轻痛苦。忘了它。这可能是个坏主意!

    M.

    【讨论】:

      【解决方案8】:
      1. 查看Constructing Language Processors for Little Languages。我相信这是一个非常好的介绍。事实上,当我在使用模板语言解析器时遇到问题时,我只是在 2 天前查阅了我的副本。

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

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

      【讨论】:

        【解决方案9】:

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

        我们的DMS Software Reengineering Toolkit 是一种商业解决方案,可以以相对适中的成本构建完整的翻译人员。

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

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

        【讨论】:

        • 嘿,艾拉,你不为他们工作吗?您不应该加入免责声明,说明您正在为您的公司服务吗?
        • 我几乎是 am 他们。检查我的生物。不会改变答案的有效性。
        • 我并不怀疑,坦率地说,您的产品对我来说看起来很有趣 - 如果我知道它的成本是多少,我很想试一试。在我看来,知道答案是你的产品似乎更诚实,而不是在调查后发现它。不管它是否有意(当被问及这个问题时你一直很坦率,所以我没有指责你有任何恶意),它可能会给人一种不诚实的印象。或者,换一种说法——坦诚相待会让你更有可能得到我的钱:)
        【解决方案10】:

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

        解析并不是一件容易的事,我们至少要花一个学期的时间。不过,是可以学习的。我建议从 Terrence Parr 关于language implementation patterns 的书开始。有很多关于编译和解析的好书,可能最喜欢和最讨厌的是Dragon Book

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

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

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

        【讨论】: