乐者为王

Do one thing, and do it well.

使用ANTLR构建PowerScript语法分析器(3)

转义字符(Special ASCII Characters)

PowerScript中转义字符是以波浪号(~)开头。下图是PowerScript支持的完整的转义字符,#字符表示数字。Decimal由三个十进制数组成,范围是000-255;Hexadecimal由两个十六进制数组成,范围是00-FF;Octal由三个八进制数组成,范围是000-377。

注意:#表示数字是必须的。譬如,必须用~007这种样式来表示转义字符,而不能是~7这种。

这里是转义字符的词法规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
fragment
Escape
    : '~' ('n'|'t'|'v'|'r'|'f'|'b'|'\"'|'\''|'~')
    | DecimalEscape
    | HexEscape
    | OctalEscape
    ;

fragment
DecimalEscape
    : '~' ('0'..'1') ('0'..'9') ('0'..'9')    // 000 - 199
    | '~' '2' ('0'..'5') ('0'..'5')           // 200 - 255
    ;

fragment
HexEscape
    : '~h' ('0'..'9'|'a'..'f'|'A'..'F') ('0'..'9'|'a'..'f'|'A'..'F')    // 00 - FF
    ;

fragment
OctalEscape
    : '~o' ('0'..'3') ('0'..'7') ('0'..'7')   // 000 - 377
    ;

字符和字符串字面量(Character and String Literals)

PowerScript程序中字符和字符串字面量没有明显的区别。字符是指由单引号(')或双引号(")括起来的一个ASCII字符,例如:

1
2
3
char c
c = 'T'
c = "T"

字符串字面量则是指由单引号或双引号括起来的不多于1024个的ASCII字符串,例如:

1
2
3
string s
s = 'This is a string'
s = "This is a string"

由于两者没有明显区别,因此在词法分析时只能将两者都作为字符串字面量来处理。至于到底是字符还是字符串,只有到了语意分析阶段才能作出判断。

1
2
3
4
5
6
7
8
STRING_LITERAL
    : ( '\'' (Escape|~('~'|'\r'|'\n'|'\''))* '\''
      | '\"' (Escape|~('~'|'\r'|'\n'|'\"'))* '\"'
      )
      {
          System.out.println("string>" + getText());
      }
    ;

数字和布尔字面量(Numeric and Boolean Literals)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
INTEGER_LITERAL
    : ('0'|'1'..'9' ('0'..'9')*)
      {
          System.out.println("integer>" + getText());
      }
    ;

FLOAT_LITERAL
    : ( ('0'..'9')+ '.' ('0'..'9')* Exponent?
      | '.' ('0'..'9')+ Exponent?
      | ('0'..'9')+ Exponent?
      )
      {
          System.out.println("float>" + getText());
      }
    ;

BOOLEAN_LITERAL
    : ('true'|'false')
      {
          System.out.println("boolean>" + getText());
      }

    ;

fragment
Exponent
    : ('e'|'E') ('+'|'-')? ('0'..'9')+
    ;

标识符(Identifier)

标识符规则可以参看PowerScript标识符一文,以下是标识符的词法规则:

1
2
3
4
5
6
7
8
9
10
11
IDENTIFIER
    : Letter (Letter|'0'..'9'|'$'|'#'|'%')*    // 暂时不支持短横线(-)
      {
          System.out.println("identifier>" + getText());
      }
    ;

fragment
Letter
    : ('A'..'Z'|'a'..'z'|'_')
    ;

Comments