Scade——学习笔记

来源:互联网 发布:斗牛神器软件下载 编辑:程序博客网 时间:2024/06/14 02:51
词汇元素也叫词位被用于描述语言结构的句法
正则表达式符号:
符号                         含义
ID=re                    在正则表达式中ID被定义为re|                         替代re?                     出现re的次数为0或者1次re*                      出现re的次数为0或者更多次re+                      至少出现一次(re)                     分组[chars]                  匹配chars中含有的任何字符[x-y]                     字符串集范围从x到y

抽象句法符号:
符号                            含义
::=                         被定义为|                            替换[[X]]                       X至多出现一次{{X}}                       X出现0次或多次{{X}}+                      X至少出现一次((X|Y))                     分为X组或者Y组abc                         关键词终端符号abcINTEGER                     终端符号以外的关键词xyz                         非终端符号^:a:int32^n: 定义一个整形长度为n的数组a

词位
SCADE能用几种符号去描述值。整形能被写为二进制、八进制、十六进制值和与一些表达式混合使用。它被当做前缀或者无类型。
非十进制整形字符被当做无符(通常被当做负数)。浮点型用十进制或者科学计数符号表示。字符被描述为标准的ASCII码。
DIGIT2 =[0-1]DIGIT8 =[0-7]DIGIT10 =[0-9]DIGIT16 =[a-f][A-F][0-9]INTEGER2 =0b DIGIT2+  #二进制INTEGER8 =0 DIGIT8+   #八进制INTEGER10 =0 | ([1-9]DIGIT10*) #十进制INTEGER16 =0x DIGIT16+#十六进制INTEGER =INTEGER2|INTEGER8|INTEGER10|INTEGER16TYPED_INTEGER= INTEGER(_i|_ui)(8|16|32|64)#定义整形的长度和类型EXPONENT =[eE][+-]? DIGIT10+;#科学计数法FLOAT =DIGIT10+.DIGIT10*EXPONENT?|DIGIT10*.DIGIT10+EXPONENT?#浮点类型TYPED_FLOAT=FLOAT(_f32|_f64)#定义浮点类型的字节长度LETTER =_|[a-z]|[A-Z]#字母ALPHANUMERIC=DIGIT10|LETTER#字母数字组合WORD =LETTER ALPHANUMERIC* #单词是字符与字母与数字组合CHARACTER=ALPHNUMERIC|SPACE|[!"$#&'()*+,-./:;<=>?@[]\^`|{}~]# 字符CHAR='CHARACTER'|'\x DIGIT16 DIGIT16';ID=WORD;NAME='WORD;


符号列表
<> <= >= << >> = < > () [] {} -> ::  .. ;   , . : ^ @ # _ | + - * /



$符号被作为操作的名字。
字首操作符
PREFIXOP ::=$+$|$-$|$*$|$/$|$mod$|$=$|$+$|$<>$|$<$|$>$|$<=$|$>=$|$@$|$times$|$and$|$or$|$xor$|$land$|$lor$|$lxor$|           $lsl$|$lsr$|+$|-$|not$|$or$|lnot$|reverse$

关键字列表
abstract,actived,and,assume,automation,bool,case,char,clock,const,default,do,else,elseif,emit,end,enum,every,flase,fby,final,flatten,float,float32,float64,fold,foldi,foldw,foldwi,function,guarantee,group,if,imported,initial,int8,int16,int32,int64,integer,is,land,lnot,lor,lsl,lsr,last,let,make,map,mapfold,mapfoldi,mapfoldw,mapfoldwi,mapi,mapw;mapwi,match,merge,mod,node,not,numeric,of,onreset,open,or,package,parameter,pre,private,probe,public,restart,resume,returns,reverse,sensor,sig,signed,specialize,state,synchro,tel,them,times,transpose,true,type,uint8,uint16,uint32,uint64,unless,unsigned,until,var,when,where,with,xor

注意关键词:onreset,abstract,parameter被保留但未被使用


注释:

单行注释开始用“--”
多行注释开始“\*”,结束“*\”

程序
pragma ::=#progma CHARACTER*#end|#ALPHANUMERIC+

程序和包
path ::=ID{{::ID}}path_id ::=[[path ::]]IDpackage_decl ::=package[[visibility]] ID {{decls}} end;

七中顶级申明:
decls  ::=open path;          package_decl group_block type_block const_block sensor_block usr_op_decl 
一个包不能被打开多次,即使是不同的路径。一个包不能打开本身。


例子:
申明一个合格的路径:
package P1  const foo :int16 =3;end;package     P2  const bar : int16=4;end;const foobar : int16=P1::foo+P2::bar;

 
 算法解析:打开指令将包括Q::R包进行申明而不是P::R包,由于这是第一次出现的R中的封装结构选自B开始
package P  package R   ...  end;end;package Q  package R   ...  end;  package S     open R   ...  end;end;


安装包中的申明不是相对的:
package P1  open P1;  const     iC1: T1 =2;  package P1    type T1=int32;end;end;


错误源于打开多次申明:识别码foo被用作常量和类型名为foo的发生冲突通过打开指令。
package P1   type foo =int16;endopen P1;const foo:bool =true;

一个打开的包中的子包不能使用open指令。P2包中的第二个申明在这个程序是有效的,因为P1中的P2不可见:
package P1  package P2  ...  end;end;open P1;package P2  ...end;


正在打开的包是不可及:申明的P1包下被打开的P2包是不被考虑的,当打开后者。常量foo不被识别在foobar的定义中,出现一个错误:
package P1  package P2    const foo:int32 =0;  end;  open P2;  const bar:int32=foo+1;end;open P1;const foobar:int32=foo*2;








0 0
原创粉丝点击