设为首页
收藏本站
切换到窄版
登录
立即注册
找回密码
搜索
搜索
本版
帖子
用户
快捷导航
论坛
BBS
C语言
C++
NET
JAVA
PHP
易语言
数据库
IE盒子
»
论坛
›
IE盒子
›
易语言
›
我的中文编程语言实践
返回列表
发帖
查看:
134
|
回复:
2
我的中文编程语言实践
[复制链接]
雨泽天成
雨泽天成
当前离线
积分
11
3
主题
5
帖子
11
积分
新手上路
新手上路, 积分 11, 距离下一级还需 39 积分
新手上路, 积分 11, 距离下一级还需 39 积分
积分
11
发消息
发表于 2023-1-12 03:46:23
|
显示全部楼层
|
阅读模式
背景
之前文章有写过个人非常喜欢的Rebol语言,冷门但很有意思,当然和Java这样的主流编程语言相比,工程性上相对较差,也限制了语言的流行,逐渐式微。出于兴趣,个人用多种语言实现了类Rebol的RML语言,一方面锻炼个人的编程能力,另一方面也检验了对Rebol语言的理解。有了以上经验,22年国庆期间,无聊间打算实现一个中文编程语言,于是有了这个项目。
基本问题
什么是中文编程?大抵可以分为一下几类:
1、使用现有语言,采用关键字替换,实现中文编程,但本身依赖原语言。
2、从头实现,使用中文实现基本的语法逻辑。由于编程语言的基本语法大同小异,所以这种实现总体上看仍是传统语言的中文实现。个人认为最为成功的中文编程语言-易语言也归属这一类,通过与IDE的深度结合,提供了比较新颖的编程体验。总结一下就是这一类是传统语言的内核,部分创新。
3、自然语言编程的中文实现。这应该是呼声最大的一种,但实现起来难度太大。编程语言要求语义明晰,而自然语言基本都存在歧义的情况,最终可能还是需要通过语法限制来实现。随着人工智能的发展,尤其是NLP的发展,兴许会成为自然语言编程的突破口。
由于本人非科班出身,能力也相当有限,因此实现的是第二种,从语法解析开始,实现一门中文解释型编程语言。
语法解析
中文的语法解析与英文存在差异,英文包含词、句,而中文包含字、词、句。英文通过空格划分单词,但中文不依赖空格,而是根据上下文进行组词、断句,这增大了语法解析的难度。目前常见的解决方案大概有两种:
1、使用文言文,单字为词。
2、引入空格分词,但和常见的中文用法不一致。
本人期望尽量贴近中文的常规用法,所以采用的方法是:定义关键字和语法元素,分割代码token,然后根据token组合,确定对应的表达式。
关键字和语法元素
切割后的token,进入判断逻辑,判断其对应的表达式。例如,如果第一个token是“变量”,那么可以判断这是一个定义变量的表达式,根据后续的token补全其表达式即可。再如第一个token是“如果”,则为逻辑分支语句。如果不符合语法中规定的语句的要求,则会视为单个值。
这样做的好处是符合了中文的常规用法,但是也存在问题,如果用户定义的标识符中包含关键字,会被拆分,这里做了相应的处理,多个token包含关键字,但不属于任一语句,则合并为单一token。目前在小规模测试用例中,可以解决问题,但在较大代码量,尤其是长句中的表示,不能保证稳定。
通过以上步骤,可以构建出基于表达式的语法树,之后使用递归下降求解即可实现程序逻辑。
基本语法
语法上主要参照JavaScript,尽量保持简单。
定义变量,以“变量”开头,语句以分号结尾
变量甲为123; 可以通过变量名获取变量的值,也可以进行基本的算术运算
分支语句
“如果”开头表示分支,语句块由冒号“:”开始,以句号“。”结束。
这里的“显示@”是函数调用,对应print。字符串用双引号表示。
循环语句
当循环(综合了while和for循环)
遍历语句(类似foreach)
支持中英混编
数组用中括号表示,元素间用顿号分隔。这里最后会返回遍历的次数,所以最后又显示了一个3。
如果输入的是单个语句,本行结束时可以省略分号。
尝试语句(try...catch...finally)
定义函数、调用函数
异步函数
对象
现状和展望
目前已实现了该语言的基本语法和一些基础的标准库函数,支持模块化,可以写一些小的程序。后续可能会继续丰富内置的库函数,提高实用性。
当然,这个项目目前并不是真的要做出点什么,算是一次简单的尝试,希望有大佬能给我们带来更有意思的编程语言。
回复
使用道具
举报
遂宁恒玺典当
遂宁恒玺典当
当前离线
积分
12
3
主题
6
帖子
12
积分
新手上路
新手上路, 积分 12, 距离下一级还需 38 积分
新手上路, 积分 12, 距离下一级还需 38 积分
积分
12
发消息
发表于 2023-1-12 03:46:46
|
显示全部楼层
自然语言属于人工智能,,,编程语言还是要更加偏向工程化,工程化的东西千万不要太灵活,太多歧义,这样便于标准化
回复
使用道具
举报
牛善和
牛善和
当前离线
积分
5
0
主题
4
帖子
5
积分
新手上路
新手上路, 积分 5, 距离下一级还需 45 积分
新手上路, 积分 5, 距离下一级还需 45 积分
积分
5
发消息
发表于 2023-1-12 03:47:18
|
显示全部楼层
lisp对我来说已经没什么新意了,我文章里提到的Rebol就是lisp发展过来的,语序和forth刚好反过来,我自己已经实现过另外一门语言RML了
回复
使用道具
举报
返回列表
发帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
PHP
数据库
C语言
NET
C++
快速回复
返回顶部
返回列表