8
16
2012
0

模块计算语言的设计

本站文章,皆为原创,如需转载,请注明出处,违者必究

一直以来,我都想开发一款类似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的高、宽值

(未完待续)

Category: 默认分类 | Tags: | Read Count: 1125

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com