Skip to content
This repository has been archived by the owner on Jan 21, 2019. It is now read-only.

原型探讨: 基于自然语言的编程语言 #1

Open
nobodxbodon opened this issue Aug 5, 2017 · 16 comments
Open

原型探讨: 基于自然语言的编程语言 #1

nobodxbodon opened this issue Aug 5, 2017 · 16 comments
Assignees

Comments

@nobodxbodon
Copy link
Member

program-in-chinese/overview#16 的后续

这里是起初的设想. 先写点假想的例程看看, 如果有可行性的话,就试着做个原型.

下面这段话(出处):

某投资方法,可以有8%的年回报率,那么1000元的初始投入资金,3年之后会变成多少

结巴分词之后是:

某 / 投资 / 方法 / , / 可以 / 有 / 8 / % / 的 / 年 / 回报率 / , / 那么 / 1000 / 元 / 的 / 初始 / 投入 / 资金 / , / 3 / 年 / 之后 / 会 / 变成 / 多少

然后, 关键的问题是如何从这里到下面的代码逻辑(暂用Java演示, 其他语言或者伪代码亦可):

    float 资金 = 1000f;
    float 年回报率 = 0.08f;
    for (int 年份 = 0; 年份 < 年限; 年份 ++) {
      资金 = (1 + 年回报率) * 资金;
    }
    return 资金;
@nobodxbodon nobodxbodon self-assigned this Aug 5, 2017
@nobodxbodon
Copy link
Member Author

模糊的思路是:

  1. 定义一系列业务方法, 比如
资金(年) = 年==0 ? 初始资金 : (1+年回报率)*资金(年-1)
  1. 定义语法:
xx的YY => YY=xx 

比如:
8%的年回报率 => 年回报率 = 8%
1000的初始资金 => 初始资金 = 1000

x年之后多少 => F(x), F是一个当前语境下的关于"年"的方法, 就是"资金"
  1. parse之后得到对应参数值(年回报率, 初始资金), 运行
资金(3)

感觉好像就是个DSL了

@nobodxbodon
Copy link
Member Author

nobodxbodon commented Aug 5, 2017

为了简化实现, 考虑一个非常非常小的问题域 -- 家庭人际关系. 示例"程序"和对应返回值如下:

我是大明的爸爸, 大明是小明的爸爸, 我是小明的什么人? => 爷爷

大明是小明的爸爸, 大明是小红的爸爸, 小明是小红的什么人? => 姐姐/妹妹/哥哥/弟弟

小强是我的爸爸的哥哥的儿子的妹妹, 小强是我的什么人? => 堂妹

小红是小王的什么人? => 不知道

小红是小张的弟弟, 小王是小吴的妹妹, 小红是小王的什么人? => 不知道

小王是什么人? => 错误: 语法不识别

@nobodxbodon
Copy link
Member Author

nobodxbodon commented Aug 5, 2017

为了尽量简化语法分析, 省去分词和标点. 实际程序如下:

大明 是 小明 的 爸爸
小明 是 小红 的 爸爸
大明 是 小红 的什么人

基本的语法如下(很不严格的Antlr格式):

程序: (关系声明'\n')+ 关系问题
关系声明: 人物 ' 是 ' 人物 ' 的 ' 关系
关系问题: 人物 ' 是 ' 人物 ' 的什么人'
人物: 任何字符
关系: 爸爸/妈妈/儿子/女儿/姐姐/妹妹/哥哥/弟弟/爷爷/奶奶/孙子/孙女/外公/外婆/外孙/外孙女/堂姐/堂妹/堂兄/堂弟/表姐/表妹/表兄/表弟

@nobodxbodon
Copy link
Member Author

试着把Antlr4的源文件中文化了. 发现Token必须用大写开头. 暂时用T开头表示. 另外还有开头的grammar.

暂时用grun -gui​ 命令作简单测试. 刚开始看The Definitive Antlr4 Ref, 2nd.

@ice1000
Copy link

ice1000 commented Aug 6, 2017

你这语法 Kotlin 就能写,完全不需要自己整编译器

@ice1000
Copy link

ice1000 commented Aug 6, 2017

不对 我没看到前面

@swizl
Copy link

swizl commented Nov 3, 2017

openjdk 有靠谱一点的编译指南吗?

@nobodxbodon
Copy link
Member Author

@swizl ? openjdk和这个issue有关吗?
还是说你在考虑汉化java编译器? 不妨另开issue讨论?

@swizl
Copy link

swizl commented Nov 3, 2017

python的中文保留字已经搞定了。准备接着看一下JAVA的。之前openjdk在cygwin和mingw下没编过去,再在wsl上试试。再编不过就另开issue

@nobodxbodon
Copy link
Member Author

@swizl 恭喜! Java编译器汉化感觉还是挺大的题目, 还是另开issue为好 :)

@htwx
Copy link

htwx commented Nov 4, 2017

汉化编译器都不难 包括 C# JAVA 如果没有有效的汉化库的方法,只是汉化编译器作用不大, 大家要多想想 怎么汉化 库

@nobodxbodon
Copy link
Member Author

@htwx 汉化库/API请移步把最常用的开源的英文API进行中文化. 以免这里歪楼太严重 :)

@htwx
Copy link

htwx commented Nov 4, 2017

怎么说呢, 英文 api 中文化 也要从 编译器或运行器来实现, 在外部实现 就要重写api 了
我的那个 CTS也是如果就只是汉化关键字 真的只有10分钟就完了, 难就难在 要支持汉化的API 了,
这个我 看过好几个编译器的源码了, 想实现 api 中文 必须从 编译器 或运行时 来实现.

@nobodxbodon
Copy link
Member Author

@htwx 请不要在这个issue里讨论不相干的内容了. 这个帖: 把最常用的开源的英文API进行中文化才是合适的主题帖.

@ice1000
Copy link

ice1000 commented Nov 4, 2017

中文编程最近被扣上了民科的帽子,你们怎么看

@nobodxbodon
Copy link
Member Author

呵呵 国外CS有个玩笑的说法 带Science的学科都不是科学, 比如Physics, Chemistry都不带. 话说, 这里歪楼太厉害啊. 打算在综合区里开个水帖...

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants