一直以来,我都想开发一款类似Simulink的方框图计算软件。这种软件可以方便的对一些线性系统进行建模,从而分析出一个复杂系统对内和对外的输入输出以及调节机制。在Matlab之中,主要用于实现模型的都是一些固定功能的功能模块,当然,他也支持一种用户自定义的用Matlab语言进行编写的自由模块。Matlab设计的是Simulink模式,而对于我所设计的Realsim软件来说,我期待所有模块都可以由用户来定义,最终通过源代码的方式发布一系列的原配功能模型,以实现Matlab的功能化对齐。
Matlab所采用的M语言本身,过于贴近Fortran的思维方式,经过多年的使用经历,作为C系语言的开发者来说,采用C/C++一类的思维模式当然是最好的,同时需要针对具体情况具体分析。从本质上来讲,我设计Realsim本意并非简单的复制一个Simulink,在Matlab之中,M语言自始至终都是考虑为控制台编写运行脚本提供服务,而并非面向Simulink的功能化模块。
Realsim所采用的语言,按照我的思路,应该仅仅是面向Realsim的功能化模块的,无需考虑控制台的各种功能。而对于模块来说,如果我们把它想象为一个封闭黑箱系统,那么它对外只是一些输入和输出(单数、向量、矩阵),所以必须考虑对C系语言扩展到全数据类型的支持,因而下面我们做两部分工作:
-
第一,对词法进行定义
- 首先,定义内嵌功能名(分隔、运算、逻辑、循环、分支、返回)
- 其次,定义数字型词法(整数、小数)
- 第三,定义定义名词法(函数、变量名)
因而按照如下定义:
内嵌功能:,, ;, (, ), [, ], {, }, +, -, *, /, %, ^, <, >, =, !, &&, ||, +=, -=, *=, /=, %=, ^=, <=, >=, ==, !=, &=, |=, if, else, break, for, switch, case, do, while, return, null (共计32种符号,42种状态,其中null为0X0矩阵,意味着内容为空) 数字类型:[0-9]+, [0-9]+.[0-9]* (共计两个状态) 定义名称:[_a-zA-Z][_a-zA-Z0-9]* (共计一个状态)
有了以上的词法定义,我们就可以开发词法器了。按照传统的方式,我们采用自动机来完成这部分的开发,当然,首先需要我们设计一个状态表。现在我来设计这样的状态表,它是个二维矩阵,状态表默认值初始化为0,横向宽256,代表当前符号类型(ASCII),纵向高42,分别代表当下状态类型。在一种状态下遇到某一条件符号,则会进入相应的新状态,最终得到结果状态后,则跳转返回最终值。跳出条件为,状态最高位0x80设置为1。
代码如下:
// 各种词法状态 #define ST_INITIAL 0x00; #define ST_COMMA 0x80; #define ST_SEMICOLON 0x81; #define ST_LEFT_PARENTHESES 0x82; #define ST_RIGHT_PARENTHESES 0x83; ... struct CLexer { unsigned char m_nTable[45][256]; Lexer() { // 初始化状态表 for(int i = 0; i < 45; i++) for(int j = 0; j < 256; j++) m_nTable[i][j] = ST_INITIAL; // 对状态跳转进行编程 m_nTable[0][','] = ST_COMMA; m_nTable[0][';'] = ST_SEMICOLON; m_nTable[0]['('] = ST_LEFT_PARENTHESES; m_nTable[0][')'] = ST_RIGHT_PARENTHESES; ... } int Process(CSource *src) { unsigned char nStatus = 0; while (!(nStatus & 0x80)) { nStatus = m_nTable[nStatus][src->text[src->index++]]; } return nStatus; } };
-
第二,对数据类型进行改造和扩展。
- 首先,Realsim语言之中,仅保留浮点型变量,去除字符型变量与整形变量、指针的支持。
- 其次,每一个变量全都以矩阵实现,默认用于计数和控制的变量为1X1矩阵。
- 第三,变量有默认的查询函数,和取数据功能。
这样我们得到如下的范例:
a = 1; // 赋值,直接赋予单数,数字默认为double浮点型 a = {{1, 2, 3}, {4, 5, 6}}; // 赋值,采用C语言标准来实现,摒弃M语言面向数学家的方式 b = a[2][3]; // 取值,取后b自动初始化为相应尺寸,当前结果为1X1单数 b = a[]; // 查询,获取a矩阵尺寸,结果为1X2向量,表达a的高、宽值
(未完待续)
2023年9月03日 22:00
Students Practicing UPMSP 6th Important Question paper 2024 helps the Students to Perform well in the Public Exam 2024, Here we have Compiled the UP Board Model Paper 2024, Students can Download the Guess Paper of all the Subjects Social Science, Scince, Mathematics, Hindi, English, The board will soon Release the UP Question 2024 for the Remaining Subjects as well.Students UPMSP 6th Question Paper 2024 Check the UP Model Paper 2024 this Web page Provide Direct links for Subject Wise pdf Download, Important Questions That Appear in Examination 2024 are as per the Pattern issued by Uttar Pradesh Madhyamik Shiksha Parishad Students Pass Exam with Outstanding Marks.