当前位置:  开发笔记 > 编程语言 > 正文

有什么理由我无法创建支持中缀,后缀和前缀功能的语言,还有更多?

如何解决《有什么理由我无法创建支持中缀,后缀和前缀功能的语言,还有更多?》经验,为你挑选了1个好方法。

我一直在考虑创建一种非常适合创建DSL的语言,允许定义中缀,后缀,前缀或甚至由多个单词组成的函数.例如,您可以按如下方式定义中缀乘法运算符(其中已定义了乘法(X,Y)):

a * b => multiply(a,b)

或后缀"平方"运算符:

a squared => a * a

或者是C或Java风格的三元运算符,它包含两个散布着变量的关键字:

a ? b : c => if a==true then b else c

显然,在这种语言中存在大量的歧义空间,但如果它是静态类型的(使用类型推断),那么大多数歧义可以被消除,而剩下的那些可以被认为是语法错误(通过添加括号来纠正适当).

有什么理由我没有看到这会使这个极其困难,不可能,或者只是一个简单的坏主意?

编辑:很多人都指出了可以做到这一点或类似事情的语言,但我实际上对如何实现自己的解析器的指针感兴趣,或者如果这样做我可能会遇到的问题.



1> Norman Ramse..:

这不是很难做到的.您需要为每个运营商分配一个固定(中缀,前缀或后缀)和优先级.将优先级设为实数; 你以后会感谢我的.优先级高的运算符比优先级较低的运算符绑定得更紧密; 在相同的优先级,你可以要求用括号消除歧义,但你可能更愿意允许一些运算符关联,所以你可以写

x + y + z

没有括号.一旦你有每个运算符的固定性,优先级和关联性,你就会想要编写一个运算符优先级解析器.这种解析器相当简单; 它从左到右扫描令牌并使用一个辅助堆栈.龙书中有一个解释,但我从未发现它非常清楚,部分原因是龙书描述了一个非常一般的运算符优先解析案例.但我不认为你会觉得困难.

你需要注意的另一个案例就是你有的时候

prefix (e) postfix

在哪里prefixpostfix具有相同的优先权.这种情况还需要括号来消除歧义.

我的论文Unpsarsing Preions with Prefix和Postfix Operators在后面有一个示例解析器,你可以下载代码,但它是用ML编写的,所以它的工作对业余爱好者来说可能并不明显.但是,整个固定业务等都得到了非常详细的解释.

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有