Label: ♦chinese

[95] 道(Dao)语言规范说明1.1 (草稿: Alpha 1) - 词法结构

Comment

道(Dao)语言规范说明1.1 (草稿: Alpha 1) - 词法结构

  1. 简介
  2. 词法结构
  3. 变量,值和类型
  4. 表达式
  5. 程序语句
  6. 函数
  7. 模块和名字空间

1 简介

 Top

2 词法结构

 Top
  1. 全角到半角的字符转换
  2. 注释
  3. 引号
  4. 关键字
  5. 基本字符类的定义
  6. 标识符
  7. 常量
  8. 运算符
  9. 杂项

道语言源程序是由使用UTF-8编码(一与ASCII兼容的多字节Unicode编码)的文本表示。 程序的源代码里的有些字符在进行词法解析时会被自动转换。

2.1 全角到半角的字符转换

 Top

Unicode编码区间0xff00-0xff5f的全角字符将被转换为相应的半角字符。 这种转换仅在注释和字符串常量以外的部分进行。 这种转换主要是为了加强对使用非西方语言编程的支持。

2.2 注释

 Top

道语言主要使用井号#来标记注释, 使用双斜杠的C++风格注释方法也将被支持:
  • 单行注释: 从 # 到行末;
  • 单行注释: 从 // 到行末(未实现);
  • 多行注释: 一对 #{ #} 之间的部分;
这里字符 #(0x23) 和 {(0x7b) 可以是它们的全角版本,即,0x23+0xfee0, 和 0x7b+0xfee0。 多行注释可以包含其他 #{ #} 对,不过它们需要被恰当地配对, 这也就是说,多行注释可以嵌套。

2.3 引号

 Top

用来标记字符串常量的基本引号是ASCII单引号0x27和双引号0x22。 此两种引号的全角符号和Unicode里的左右单双引号也都被作为字符串常量 标记引号处理。
左引号 右引号 转换
单引号 0x27 单引号 无转换
双引号 0x22 双引号 无转换
全角单引号 0x27+0xfee0 全角单引号 单引号0x27
全角双引号 0x22+0xfee0 全角双引号 双引号0x22
Unicode左单引号 0x2018 右单引号 0x2019 单引号0x27
Unicode左双引号 0x201c 右双引号 0x201d 双引号0x22

当为字符串常量处理引号时,这些引号需要象上表中 左引号 右引号 列所列出的方式配对。

(TODO: 适当处理注释里未配对的引号,和前面有反斜杠的引号; 并不再支持重音符0x60作为引号)

2.4 关键字

 Top

下面的关键字为道语言所保留:
  • 类型或结构:
    Kwd1  ::=  any  |  enum  |  int  |  float  |  double  |  long  |  complex 
                  |  string  |  array  |  list  |  tuple  |  map  |  stream
                  |  class  |  routine  |  function
  • 变量域:
    Kwd2  ::=  my  |  const  |  local  |  global
  • 类的额外关键字:
    Kwd3  ::=  final  |  private  |  protected  |  public  |  virtual  |  self
  • 分支和循环:
    Kwd4  ::=  if  |  else  |  elif  |  elseif  |  for  |  in  |  while  |  do  |  until
                  |  switch  |  case  |  default  |  break  |  skip
  • 异常处理:
    Kwd5  ::=  try  |  retry  |  rescue  |  raise
  • 其他语句:
    Kwd6  ::=  use  |  load  |  import  |  require  |  by  |  return  |  yield
  • 标准或内置库对象:
    Kwd7  ::=  stdio  |  stdlib  |  math  |  coroutine  |  reflect 
                  |  mpi  |  network  |  mtlib
  • 标准或内置库类型:
    Kwd8  ::=  pair  |  curry  |  buffer  |  thread  |  mutex 
                  |  condition  |  semaphore
  • 其他:
    Kwd9  ::=  typedef  |  syntax  |  as  |  and  |  or  |  not
                  |  async  |  hurry  |  join  |  null
    (TODO: 将 nil 改为使用 null )
Keyword  ::=  Kwd1  |  Kwd2  |  Kwd3  |  Kwd4  |  Kwd5
                    |  Kwd6  |  Kwd7  |  Kwd8  |  Kwd9

2.5 基本字符类的定义

 Top

基本字符类:
DecDigit  ::='0'  ...  '9'
HexDigit  ::=  DecDigit  |'a'  ...  'f'|'A'  ...  'F'
AsciiLetter  ::='a'  ...  'z'|'A'  ...  'Z'

WideChar  ::="UTF-8 encoded unit of one or more bytes"
WideAlpha  ::=  WideChar  &  iswalpha(  WideChar  )  !=  0
WideAlnum  ::=  WideChar  &  iswalnum(  WideChar  )  !=  0
这里 iswalpha() 和 iswalnum() 是两个C99函数, 用于判别宽字符是否属于某个字符类。这里 WideChar 可以是多于一个字节,这种情况下,这些UTF-8字节将被转换到Unicode编码, 然后再使用这些C99函数作判别。

2.6 标识符

 Top

AsciiIdentifier  ::=(  AsciiLetter  |'_')(  AsciiLetter  |  DecDigit  |'_')*
WideIdentifier  ::=(  WideAlpha  |'_')(  WideAlnum  |'_')*

Identifier  ::=  AsciiIdentifier  |  WideIdentifier

2.7 常量

 Top

2.7.1 数常量
 Top
整数常量:
DecInteger  ::=  DecDigit+
HexInteger  ::=('0x'|'0X')  DecDigit+

Integer  ::=  DecInteger  |  HexInteger
LongInteger  ::=  Integer  'L'
HexInteger'L'暂未支持。

浮点数常量:
DotDec  ::=  DecDigit*'.'  DecDigit+
DecDot  ::=  DecDigit+'.'  DecDigit*
DecSinglePrecision  ::=  DotDec  |  DecDot
DecNumber  ::=  DecInteger  |  DecSinglePrecision
SciSinglePrecision  ::=  DecNumber  'e'['+'|'-']  DecInteger
SciDoublePrecision  ::=  DecNumber  'E'['+'|'-']  DecInteger

Float  ::=  DecSinglePrecision  |  SciSinglePrecision
Double  ::=  DecNumber  'D'|  SciDoublePrecision

复数虚部常量:
ComplexImaginary  ::='$'

2.7.2 字符串常量
 Top

基本字符串常量:
SingleQuoteString  ::=' '' ValidCharSequence '' '
DoubleQuoteString  ::=' "' ValidCharSequence '" '

使用全角引号的字符串常量:
DBCSingleQuoteString  ::=' ' '  ValidCharSequence  ' ' '
DBCDoubleQuoteString  ::=' " '  ValidCharSequence  ' " '

使用Unicode左右引号的字符串常量:
USingleQuoteString  ::=' ‘ '  ValidCharSequence  ' ’ '
UDoubleQuoteString  ::=' “ '  ValidCharSequence  ' ” '

这里 ValidCharSequence 是一串不含将它引起来引号的字符串, 不过这些引号可以以转义字符的形式出现在 ValidCharSequence。 下面的字符串常量是有效的:
' " '
' “ '    # 引号是 ', 因此 " “ 可以直接出现在字符串里
" ' "
" ” "
“  ' '  ”    # 其他引号也类似
' \' '
" \" "

字符串常量:
MultiByteString
    ::=  SingleQuoteString  |  DBCSingleQuoteString  |  USingleQuoteString 

WideCharString
    ::=  DoubleQuoteString  |  DBCDoubleQuoteString  |  UDoubleQuoteString 

String  ::=  MultiByteString+|  WideCharString+
这里重复标记表示两个或多个 MultiByteString 或 WideCharString 放在一起, 它们将会在词法转换时被连接成一个字符串常量。
2.7.3 字符串常量里的转义字符
 Top

转义字符:
  • \\ : 反斜杠;
  • \t : 制表符;
  • \f : 换页符;(未实现)
  • \n : 换行符;
  • \r : 回车键;
  • \' : 单引号;
  • \" : 双引号;
转义数字(未实现):
  • \ooo : 值为八进制数ooo的字符;
  • \xhh : 值为十六进制数hh的字符;
  • \uxxxx : 值为十六进制数xxxx的16位Unicode字符;
  • \uxxxxxxxx : 值为十六进制数xxxxxxxx的32位Unicode字符;

2.8 运算符

 Top

  • 一元左运算符:
    LeftUnaryOperater  ::='++'|'--'|'!'|'~'|'$'|'not'
  • 一元右运算符:
    RightUnaryOperator  ::='$'
  • 二元运算符:
    BinaryArith  ::='+'|'-'|'*'|'/'|'%'|'**'
    BinaryComp  ::='=='|'!='|'<'|'>'|'<='|'>='
    BinaryBool  ::='&&'|'||'|'and'|'or'
    BinaryBit  ::='&'|'|'|'^'|'<<'|'>>'
    CompAssign  ::='+='|'-='|'*='|'/='|'&='|'|='

    BinaryOperator  ::=  BinaryArith  |  BinaryComp  |  BinaryBool  |  BinaryBit
  • (组合)赋值:
    AssignmentOperator  ::='='|':='|'+='|'-='|'*='|'/='|'&='|'|='
  • 其他运算符:
    OtherOperator  ::=    '=>'|':'|'.'|'...'
UnaryOperator  ::=  LeftUnaryOperater  |  RightUnaryOperator

Operator  ::=  UnaryOperator  |  BinaryOperator 
                      |  AssignmentOperator  |  OtherOperator

2.9 杂项

 Top

2.9.1 分号
 Top

象其他某些语言一样,分号可以用来标记一句程序语句的结束。 不过这种分号的使用不是必须的,道语言的编译器可以根据一些 语义规则来确定程序语句的边界。
2.9.2 宏标识符和分隔符
 Top

宏标识符:
MacroIdentifier  ::=    '$'('VAR'|'EXP'|'ID'|'OP'|'BL')  Identifier

宏分隔符:
MacroSeperator  ::='\('|'\)'|'\{'|'\}'|'\['|'\]'
                                  |'\|'|'\!'|'\*'|'\+'

3 变量,值和类型

 Top

4 表达式

 Top

5 程序语句

 Top

6 函数

 Top

7 类

 Top

8 模块和名字空间

 Top

Comments

Change picture:

Choose file:

12 3
456789 10
111213141516 17
181920212223 24
2526272829 30 31

fu: Many thanks (Jul.04,04:29)

klabim: fixed Hi, great, now my test works now :- ). (Jun.30,17:51)

Nightwalker: Few suggestions (Jul.03,14:37)

This site is powered by Dao
Copyright (C) 2009,2010, daovm.net.
Webmaster: admin@daovm.net