1
以句子为单位,理解源代码。
使用集合论,一个句子对应多个字符串,储存在一个集合中。通过集合间的操作,精准地控制集合里边有哪些句子。集合论中的集合,对应文法产生式中的非终结符,但不同之处是,集合论对句子的操作更灵活。具体来说:
分配[30]个[学生类]至[班]。ban=malloc(30*sizeof(Student));
它可以翻译成如上的C语言语句。新编译原理将是一种翻译,从类似自然语言的源代码,翻译成现有的计算机语言的源代码。
如何使用集合论?集合间的运算有“加、减、连接”,分别如下:
A+B,即A并B,在A的基础上再增加一些元素。
A-B,即A交B补,从A中减去一些元素。
AB,两个集合的连接,是把集合中的元素使用排列组合的规律配对,再连接起来。
例:
A={给}
B={老婆,老公……}
C={发红包}
执行集合间连接操作后,ABC={给老婆发红包,给老公发红包,……}
2
说完集合间,说集合内。
集合内有“属于、遍历”函数,使用属于函数,判断给定句子是不是该集合的元素;使用遍历函数,依次输出集合内的所有元素。属于函数用于完成语法分析任务,遍历函数用于显示集合中的所有句子。
对于{自然数}之类的无穷集合,属于函数用正则表达式完成;遍历函数可以显示:0 1 2 3 …,挑几个特征值显示。
集合间的操作可以连成串,如A+BCD-E,这串操作的结果也是个集合,它的属于、遍历函数,是依次执行各个集合的内部函数,再把结果整合起来的结果。
例如,集合间的加操作,C=A+B,C的属于函数就可以写成“属于A或属于B”。对应的遍历函数,也将是执行完A的遍历函数,再执行B的遍历函数。
句子用字符串的集合来实现,那么句子的集合呢?理论上,语境是句子的集合;工程上,用dll包装句子的集合。具有相关、相似功能的句子,放在一个语境中,包装在一个dll里。源代码中使用某语境,即导入相关的dll。
3
如果只有上述内容,将只能完成语法分析,即判断所给句子是否属于该集合。还需要有集合间的映射,才能完成翻译工作。如何完成集合间映射?不同的工程做法不同。
未完待续。
解释上文的内容,为什么要“以句子为单位”?可以参考的内容不多,包括:人们曾经花大力气研究函数图像,但后来发现,复杂图形的函数异常复杂,以至于无法表示。后来就有了“光栅法”,即像bmp格式那样,把每个像素的颜色都记下来,这么做成功了。现在人们研究各种技术,期望实现自然语言理解,甚至是自然语言编程。这和当年研究函数图像十分相似,只要提高数据量,问题的复杂度就能大幅下降。
所以,以句子为单位理解源代码,每个句子都是一门微型语言。给编译器配一个数据库,也是有可能的。