汉语编程的核心问题和我的非形式语言解决方案

 实现汉语编程是许多中国人的梦想,但是他们没有意识到,汉语编程的首要问题和汉语英语无关,而和编译器的处理能力有关。

 

问题一 符号问题

了解C#的朋友都只知道最简单的输出"Hello World"程序语句是这样写的:

Console.WriteLine("Hello World"); 程序1

 

如果把这个语句的点号括号去掉,就变成了这样

Console WriteLine "Hello World"; 程序2

 

我的问题是:怎么让编译器把这条符号很少的程序语句编译出正确的结果?

为什么会提出这个问题:

因为我们日常使用的语言都是没有这些符号的;

 

用类似BNF简单表示上面的标准C#语句是

expression ->

identifier +“.”+ identifier +" ( "+ literal +")"

因为程序2没有非终结符点号和括号,所以上面的BNF表达式是不适用的,也不能根据这个BNF表达式编写编译程序

要正确处理变形后的程序2,已经超出了形式语言的范围,用通用的BNF已经不能正确表示了。

我的解决方案:

1 确定每个词的属性,建立描述

可以分析出表达式、

类名称identifier + 函数名称identifier + literal

2 匹配描述

类名称identifier + 函数名称identifier 可以确定这是一条调用函数的语句,再分析Console 类中是否有函数和 程序2中的函数名称identifier+ literal 匹配,如果有,表明这个语句是正确的

3 翻译到通用的函数调用

进一步翻译成 类名称identifier . 函数名称identifier( literal ),最后生成。

 

问题二 语序问题

假设要求写一个函数,实现一个物体从一个点跑到另一个点的功能。

一般语言是这么声明这个函数的

void move(Point fromPoint,Point toPoint)

 

翻译成白话就是

移动(开始点,结束点)

但是日常语言的语序不是这样的,而是

从(开始点)跑到(目的点)

按照自然语言的语序应该这么声明这个函数:

void from(Point fromPoint) move to(Point toPoint)

 

我的问题是:怎么让编译器把这条语序不一般的程序语句编译出正确的结果?

为什么会提出这个问题:

因为日常语言的语序就是这样的。

当前所有的编程语言定义函数都是来源于数学函数形式,形式都是

函数名称+参数列表

在CPU汇编级别也是如此。

一般的编程语言是无法解决语序随意放置的问题。

 

我的解决方案:

1.按主流编程语言定义函数,并实现功能

声明的函数就是void move(Point fromPoint,Point toPoint)

 

2.在此函数上加文本标注(C#用Attribute,Java用Annotation),

内容是"from(Point fromPoint) move to(Point toPoint)"

 

3.编译程序前对标注"from(Point fromPoint) move to(Point toPoint)"进行解析,建立它与函数run的一一对应关系。

 

用C#实现是这样

[新语言程序Attribute("from(Point fromPoint) move to(Point toPoint)")]

void move(Point fromPoint,Point toPoint)

 

用java的标注同样也可以实现。

 

 

posted @ 2020-04-16 09:22  Z语言  阅读(190)  评论(0编辑  收藏  举报