大摩娱乐注册 大摩娱乐登录 大摩娱乐招商QQ

Navigation menu

来源:未知 责任编辑:admin

我的中文编程语言实践

  之前文章有写过个人非常喜欢的Rebol语言,冷门但很有意思,当然和Java这样的主流编程语言相比,工程性上相对较差,也限制了语言的流行,逐渐式微。出于兴趣,个人用多种语言实现了类Rebol的RML语言,一方面锻炼个人的编程能力,另一方面也检验了对Rebol语言的理解。有了以上经验,22年国庆期间,无聊间打算实现一个中文编程语言,于是有了这个项目。

  2、从头实现,使用中文实现基本的语法逻辑。由于编程语言的基本语法大同小异,所以这种实现总体上看仍是传统语言的中文实现。个人认为最为成功的中文编程语言-易语言也归属这一类,通过与IDE的深度结合,提供了比较新颖的编程体验。总结一下就是这一类是传统语言的内核,部分创新。

  3、自然语言编程的中文实现。这应该是呼声最大的一种,但实现起来难度太大。编程语言要求语义明晰,而自然语言基本都存在歧义的情况,最终可能还是需要通过语法限制来实现。随着人工智能的发展,尤其是NLP的发展,兴许会成为自然语言编程的突破口。

  由于本人非科班出身,能力也相当有限,因此实现的是第二种,从语法解析开始,实现一门中文解释型编程语言。

  中文的语法解析与英文存在差异,英文包含词、句,而中文包含字、词、句。英文通过空格划分单词,但中文不依赖空格,而是根据上下文进行组词、断句,这增大了语法解析的难度。目前常见的解决方案大概有两种:

  本人期望尽量贴近中文的常规用法,所以采用的方法是:定义关键字和语法元素,分割代码token,然后根据token组合,确定对应的表达式。

  切割后的token,进入判断逻辑,判断其对应的表达式。例如,如果第一个token是“变量”,那么可以判断这是一个定义变量的表达式,根据后续的token补全其表达式即可。再如第一个token是“如果”,则为逻辑分支语句。如果不符合语法中规定的语句的要求,则会视为单个值。

  这样做的好处是符合了中文的常规用法,但是也存在问题,如果用户定义的标识符中包含关键字,会被拆分,这里做了相应的处理,多个token包含关键字,但不属于任一语句,则合并为单一token。目前在小规模测试用例中,可以解决问题,但在较大代码量,尤其是长句中的表示,不能保证稳定。

  通过以上步骤,可以构建出基于表达式的语法树,之后使用递归下降求解即可实现程序逻辑。

  数组用中括号表示,元素间用顿号分隔。这里最后会返回遍历的次数,所以最后又显示了一个3。

  目前已实现了该语言的基本语法和一些基础的标准库函数,支持模块化,可以写一些小的程序。后续可能会继续丰富内置的库函数,提高实用性。

  当然,这个项目目前并不是真的要做出点什么,算是一次简单的尝试,希望有大佬能给我们带来更有意思的编程语言。