实现汉语编程是许多中国人的梦想, 但是他们没有意识到, 汉语编程的首要问题和汉语英语无关, 而和编译器的处理能力有关.
问题一 符号问题
了解 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 的标注同样也可以实现.
来源: http://www.bubuko.com/infodetail-3509052.html