我正在创建一种用于创建网页的脚本语言,但不知道从哪里开始。
我有一个看起来像这样的文件:
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 Scripting Host的目标。我知道这可以做到,因为过去网络上曾经有过很多文档,但我现在似乎无法找到它们。
有人可以帮忙,还是让我开始朝着正确的方向前进?
由于
答案 0 :(得分:5)
您正在制作一个不存在的特定于域的语言。您想要翻译成另一种语言。您需要一个合适的扫描仪和解析器。你可能被告知要看看antlr。 yacc / bison,或黄金。这出了什么问题?
作为一个FYI,制作新语言是一项有趣的练习,但在你做这样的事情之前,你可能会问一个很好的“为什么?我的新语言提供了什么,我无法得到任何其他语言(合理的方式?“
答案 1 :(得分:3)
理解解析和语言创建的一点是编写编译器/解释器主要是关于对输入文本进行的一组数据转换。
通常,从输入文本开始,您将首先将其转换为一系列标记,每个标记代表您所用语言的概念或字面值。
从令牌流中,您通常会创建一个中间结构,通常是某种描述所编写代码的树结构。
然后可以出于各种原因验证或修改此树结构,包括优化。
一旦完成,你通常会把树写成其他形式 - 汇编指令甚至是另一种语言的程序 - 事实上,最早的C ++版本写出了直接的C代码,然后由一个C编译。普通的C编译器,根本不了解C ++。因此,虽然跳过组装生成步骤可能看起来像是在作弊,但它背后有着悠久而自豪的传统:)
我故意没有对特定库提出任何建议,因为理解整个过程可能比选择特定的解析器技术更重要。从长远来看,无论你使用lex / yacc还是ANTLR或其他东西都是非常不重要的。他们将(基本上)全部工作,并且已经成功地用于各种项目。
即使手工进行自己的解析也不是一个坏主意,因为它将帮助您学习解析如何完成的模式,因此使用解析器生成器往往更有意义而不是黑色伏都教盒。
答案 2 :(得分:2)
与C#类似的语言不容易解析 - 有一些自然的左递归规则。所以你必须使用一个可以正确处理它们的解析器生成器。 ANTLR很合适。
如果PEG更合适,请尝试:http://www.meta-alternative.net/mbase.html
答案 3 :(得分:1)
所以你想将C#程序翻译成JavaScript吗? Script#可以为您做到这一点。
答案 4 :(得分:1)
不是编写自己的语言然后运行翻译器将其转换为Javascript,为什么不扩展Javascript来做你想做的事呢?
看看jQuery - 它以非常自然和流畅的语法以许多强大的方式扩展Javascript。这几乎与拥有自己的语言一样好。看看人们为它创建的许多扩展,尤其是jQuery UI。
答案 5 :(得分:1)
假设您真的致力于这样做,这就是要走的路。这通常是你应该做的:source - >扫描仪 - >令牌 - > PARSER - >语法树
1)创建一个扫描仪/解析器来解析您的语言。您需要编写语法来生成可以扫描/解析语法的解析器,以标记/验证它们。
我认为这里最简单的方法是使用Irony,这样可以快速轻松地创建解析器。这是一个很好的起点
http://www.codeproject.com/KB/recipes/Irony.aspx
2)构建语法树 - 在这种情况下,我建议您构建一个简单的XML表示而不是实际的语法树,以便稍后可以遍历DOM的XML表示以吐出VB / Java Script。如果您的要求很复杂(就像您想要编译它一样),您可以创建一个DLR表达式树或使用代码DOM - 但在这里我想我们正在讨论的是翻译器,而不是编译器。
但是等等 - 如果它不是出于教育目的,请考虑从一开始就将'脚本'表示为xml,以便在吐出一些VB / Java脚本之前可以避免使用扫描器/解析器Html就是这样。
答案 6 :(得分:0)
你显然需要设计用于翻译语言的机器:解析,树构建,模式匹配,目标语言树构建,目标语言漂亮打印。 您可以尝试使用YACC(或等效项)完成所有这些操作,但您会发现解析 只是完整翻译器的 small 部分。这意味着还有更多工作要做 要做而不仅仅是解析,这需要时间和精力。
我们DMS Software Reengineering Toolkit是一种商业解决方案,可以以相对适中的成本构建完整的翻译人员。
如果你想从头开始自己做这项运动,那很好。只是为实际所需的努力做好准备。
最后一句话:如果你想获得一个好的结果,设计一个完整的语言很难。
答案 7 :(得分:0)
我不想变得粗鲁......但你为什么要这样做?
为常规语言创建解析器是一项非常重要的任务。只是不要这样做。
为什么不使用html,javascript和css(以及jquery作为上面提到的人)
如果你不知道从哪里开始,那么你可能没有这种经验,可能你没有充分的理由,为什么这样做。
我想救你痛苦。算了吧。这可能是一个不好的想法!
微米。
答案 8 :(得分:0)
查看Constructing Language Processors for Little Languages。我相信这是一个非常好的介绍。事实上,2天前,当我遇到模板语言解析器时,我只是查阅了我的副本。
尽可能使用XML。如果你想要生产这个东西,你不想手工操作词法分析器和解析器。我犯了几次这个错误。你最终会支持你真正不应该的代码。您的语言似乎主要是模板语言。 XML在那里工作得很好。就像ASPX文件是XML一样。您的服务器端块可以用Javascript编写,必要时可以修改。如果这是一个学习练习,那么一定要手工完成。
我认为编写自己的语言是一项很好的练习。所以采用大学级编译器编写课程。祝你好运。
答案 9 :(得分:0)
我个人认为每次自我挑战都是好的。我同意其他观点,如果你想要的是真实解决现实问题,那么坚持使用经过验证的解决方案可能会更好。但是,如果按照你自己的说法,你有解决这个问题的学术兴趣,那么我鼓励你继续。如果是这种情况,我可能会指出一些提示让你走上正轨。
解析并不是一项容易的任务,这是我们至少需要一个学期的方法。但是,它可以学习。我建议从Terrence Parr的书language implementation patterns开始。有许多关于编译和解析的好书,可能最受喜爱和讨厌的是Dragon Book。
这是非常沉重的东西,但如果你真的喜欢这个,并且有时间,你一定要看看。这将是Robisson Crusoe的“我将自己完成所有方法”。我最近写了一个LR解析器生成器,它花了我不过一个漫长的周末,但是经过大量阅读并在编译器上完成了两个学期的课程。
如果你没有时间或者根本不想学习像男人那样学习解析器,那么你总是可以尝试商业或学术解析器生成器。 ANTLR很好,但你必须学习它的元语言。就个人而言,我认为Irony是一个很棒的工具,特别是因为它保留在C#中,您可以查看源代码并自己学习。由于我们在这里,并且我根本不想做任何广告,我在CodePlex中发布了一个可用于此任务的小工具。为自己拿一个look,它是开源的,免费的。
作为最后的提示,如果有人告诉你无法完成,不要害怕。解析是一个困难的理论问题,但它无法学到任何东西,它确实是你的投资组合中的一个很好的工具。我认为开发人员非常善于他可以手工编写一个下降递归解析器,即使他从来没有这样做过。如果你想追求这个目标到最后,拿一个大学级的编译器课程,你会在一年内感谢我。