打印
[国产单片机]

编译器推广

[复制链接]
1618|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
abcabcabc|  楼主 | 2012-5-10 16:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 abcabcabc 于 2012-6-26 14:33 编辑

论坛地址:http://mycompiler.forumer.com/index.php 里面有win32版本可下载
需要做编译器(CISC RISC指令集都可实现)的客户请联系13316151431

语言的设计是在传统C语言上修改完善,采用直观的语法和严格的类型系统。

与传统C语言最大的区别在于:
    类型系统属于严格类型方式,没有隐式类型转换,显示类型转换在需要的地方必须使用。
    向量,或SIMD数据操作有内建的支持,无需使用SIMD intrinsic。
    数组,指针属于独立的类型,消除传统C语言在此方面容易令人含糊的表述,令代码更加清晰明了。


语法规则简述:
关键字void unsigned byte word dword int float vector typedef extern asm if else do while for switch case default break continue return stdcall
struct关键字被取消,结构体被视作自定义类型,请用typedef创建自定义类型
vector 用于定义向量类型
    vector 类型表达式 标识符[, 标识符列表];

asm 插入汇编语句
    asm 汇编语句
    asm {多条汇编语句}

extern 引用外部符号
    extern 声明语句;


extern float f;
extern void ExternalFunction(int value);

typedef 创建自定义类型
    typedef 类型名 { 声明 [ , 声明列表 ] }
    typedef 类型名 类型表达式


typedef abc   //abc,自定义类型
{
int a;
int* b;
}
typedef xyz abc *  //xyz 是 abc * 的别名

stdcall 声明函数采用win32api标准调用方式

extern void ExitProcess(stdcall UINT uExitCode);

编译指令#include #define #prefix #code #data #rodata #if #ifdef #ifndef #endif
#include 文本包含指令,用于包含文本文件,例如头文件等
#include "stdio.h"

#define 常量定义指令,用于定义常量标识符

#define abc 1+2+3
#define pi 3.14
#define string "this is a string"
#define label

#prefix 下划线指令,用于在全局变量和函数名前加插下划线
#code, #data, #rodata 字节对齐指令,用于指定代码 数据 只读数据段的字节对齐值

#code 4     //代码段按4字节对齐
#data 8     //数据段按8字节对齐
#rodata 16  //只读数据段按16字节对齐

#if, #ifdef, #ifndef, #endif 条件编译指令,用于条件编译时指定其作用域

#if abc > 100
。。。
#endif
#ifdef abc
。。。
#endif
#ifndef abc
.。。。
#endif

操作符:() [] . - ~ & * * / % + - & | ^ << >> == != < > <= >= ! && || ^^ = += -= &= |= ^=
优先级从左到右, 依次递减,左边最高,右边最低
[] 可用于获取字符串长度,类型大小,其值为常量
["This is a string"] 值为串长度,[int] 值为类型大小

常量:1 0x2 3.0 `abcd` "string" 'literal'
声明:类型表达式 标识符 [ , 标识符列表 ] ;

int a;        //a,整型
int[4] b      //b,整型数组
int[4]* c     //c,整型指针
int*[4]* d    //d,整型数组指针,其元素为整型指针
abc e;             //e,自定义类型
abc* f;            //f,自定义类型指针
vector int[4] g;   //g,整型向量
vector (int[4])* h;   //h,整型向量指针

表达式:

(*c)[2];   //引用指针c,操作其第3个元素
*(*d)[3];  //引用指针d,再引用操作其第4个元素
e.a;       //操作e的成员a
(*f).a;    //引用指针f,操作其成员a
*(*f).b;   //引用指针f,再引用操作其成员b
g+g;       //向量加法操作
*h+*h;   //引用指针h,再做向量加法操作

相关帖子

沙发
McuPlayer| | 2012-5-10 18:32 | 只看该作者
本帖最后由 McuPlayer 于 2012-5-10 18:34 编辑

不必详述语法,建议把和标准C的差异说明即可

你真写具体的语法,估计不少人看不懂正则表达式。

使用特权

评论回复
板凳
abcabcabc|  楼主 | 2012-5-10 19:33 | 只看该作者
跟标准C的区别主要是声明和指针引用的写法,还有类型系统

语言的类型系统属于严格类型,所有操作必须类型等价,不做任何隐含转换。

声明语句:左边是类型表达式,右边是标识符
int(int*)* function_pointer;      //函数指针,返回值为整型,参数个数为1个,类型为整型指针
float*[4]* array_pointer;            //数组指针,其所指向的数组的元素为4个,类型为浮点指针

指针操作:(*array)[2];         //读取array的值,作为基地址,再取其第3元素的值

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

8

帖子

0

粉丝