C语言简单子集编译器功能设计书(第一版)

来源:互联网 发布:网络购票用户名忘记了 编辑:程序博客网 时间:2024/05/29 10:05
 

1. C语言简单子集
C语言简单子集具有如下特点:
1) 数据类型
仅支持简单数据类型中的有符号2字节整型(使用16位汇编实现,因此int回归到古老的16位)。
2) 数据操作
支持以下数据操作:函数调用、赋值、四则运算、if、while、for、小于、大于、等于、小于等于、大于等于、不等于、逻辑与、逻辑或,支持多层括号运算。不支持变量初始化(自动初始化为0)。不支持连等、逻辑运算时的赋值。
3) 源文件
仅支持单个xxx.c文件程序,不支持头文件。
4) 关键字集合
main、int、if、while、for
5) 宏
不支持宏。
6) 符号集合
(、)、{、}、=、;、+、-、*、/、<、>、==、<=、>=、!=、&&、||、//
7) 函数
只支持无参数无返回值的函数。支持嵌套调用。main函数为程序入口。函数不能从中间返回,只能在最后一行返回,无“return”关键字。
8) 注释
只支持单行注释。
9) 定量制限
9.1) 函数名、变量名长度为1到32字节
9.2) 常数必须是int范围的整数(2字节的古老int,即现代的short)
9.3) 最大单词数、语法树最大节点数为32768
9.4) 源码一行最多容纳1024字节,多出部分截断
10) 输入输出
不支持输入,程序输出结果为所有用户定义的变量在生命期结束时的值和对应的函数名,输出到文件C:\c_simple_outfile(NT)或/tmp/c_simple_outfile(Linux)中。
实例:
//test.c
main(){
    int a;
int b;
int c;
    a = 1;
    b = 2;
    c = a + b * b / (b - a);
    for( a = 0; a < 10; a = a + 1 ){
        c = c + a;
    }
    a = 0;
    while( a <= 10 ){
        c = c + a;
        a = a + 1;
    }
    if( a >= 10 ){
        if( b == 2 ){
            if( c > 0 ){
                c = ( c + a * (c - b) );
            }
        }
  }
}

2. 基本语法
2.1) PROGRAM
     PROGRAM := DEFINITION ‘main’ ‘(’ ‘)’ ‘{’ BODY ‘}’
2.2) DEFINITION
     DEFINITION := ( ( VAR_DEF | FUNC_DEF )  DEFINITION  ) | NULL
2.3) VAR_DEF
     VAR_DEF := ‘int’ IDENTIFY ‘;’
2.4) FUNC_DEF
     FUNC_DEF := IDENTIFY ‘(’ ‘)’ ‘{’ BODY ‘}’
2.5) IDENTIFY
     IDENTIFY := alphabet  IDENTIFY_FOLLOW
2.6) IDENTIFY_FOLLOW
     IDENTIFY_FOLLOW := NULL | ( ( alphabet | number ) IDENTIFY_FOLLOW )
2.7) BODY
     BODY := VAR_DEFINITION STATEMENT_LIST
2.8) VAR_DEFINITION
     VAR_DEFINITION := ( VAR_DEF VAR_DEFINITION ) | NULL
2.9) STATEMENT_LIST
     STATEMENT_LIST := ( ( ASSIGN_STMT ‘;’ | IF_STMT | FOR_STMT | WHILE_STMT | FUNC_CALL ) STATEMENT_LIST ) | NULL
2.10) ASSIGN_STMT
      ASSIGN_STMT := IDENTIFY ‘=’ FORMULA
2.11) IF_STMT
      IF_STMT := ‘if’ ‘(’ BOOL_FORMULA ‘)’ ‘{’ STATEMENT_LIST ‘}’
2.12) FOR_STMT
      FOR_STMT := ‘for’‘(’ ( NULL | ASSIGN_STMT ) ‘;’ BOOL_FORMULA ‘;’ ( NULL | ASSIGN_STMT ) ‘)’ ‘{’ STATEMENT_LIST ‘}’
2.13) WHILE_STMT
      WHILE_STMT := ‘while’ ‘(’ BOOL_FORMULA ‘)’ ‘{’ STATEMENT_LIST ‘}’
2.14) FORMULA
      FORMULA := ( (‘(’ FORMULA ‘)’ ) | IDENTIFY | numbers ) FORMULA_FOLLOW
2.15) BOOL_FORMULA
      BOOL_FORMULA := ( (‘(’ BOOL_FORMULA ‘)’ ) | IDENTIFY | numbers ) BOOL_FORMULA_FOLLOW
2.16) FORMULA_FOLLOW
      FORMULA_FOLLOW := NULL | ( ‘+’|‘-’ ) FORMULA |  ( ‘*’|‘/’ ) FORMULA
2.17) BOOL_FORMULA_FOLLOW
      BOOL_FORMULA_FOLLOW := NULL | (‘||’ BOOL_FORMULA ) | ( ‘&&’ BOOL_FORMULA ) | ( ( ‘<’|‘>’ |‘<=’ |‘>=’ ) BOOL_FORMULA ) | ( ( ‘==’ |‘!=’ ) BOOL_FORMULA ) | ( ( ‘+’|‘-’ ) BOOL_FORMULA ) | ( ( ‘*’|‘/’ ) BOOL_FORMULA )
2.18 ) FUNC_CALL
       FUNC_CALL := IDENTIFY ‘(’ ‘)’ ‘;’

3. 预处理
不支持头文件。预处理时去除注释,生成临时文件xxx.c.tmp。

4. 运算优先级
Operators                         Associativity
() [] -> .                        left to right
! ~ ++ -- + - * (type) sizeof     right to left
* / %                             left to right
+ -                               left to right
<<  >>                            left to right
< <= > >=                         left to right
== !=                             left to right
&                                 left to right
^                                 left to right
|                                 left to right
&&                                left to right
||                                left to right
?:                                right to left
= += -= *= /= %= &= ^= |= <<= >>= right to left
,                                 left to right

5. 模块划分
5.1) 预处理模块
5.2) 词法语法分析器
5.3) 语义分析、汇编码生成器
5.4) 可执行文件生成器

6. 多平台
语法分析使用标准c编写,支持多平台。可执行文件生成模块,第一版只支持WindowsXP。

原创粉丝点击