乐者为王

Do one thing, and do it well.

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

构建完表达式的语法规则后就可以开始分析语句(statement)的语法规则。不过在这之前还需要先修复两个小缺陷:没有识别日期、时间和内建常量的词法规则。

在PowerScript中,日期的格式是0000-00-00,年份是4位数从1000到3000,月份从01到12,天数从01到31;时间是24小时格式00:00:00:000000,秒的小数部分可有可无,最多能有6位数字,所以时间范围是从00:00:00到23:59:59:999999。内建常量则以字母开头,字母数字组合,以“!”符号结束的字符串。

根据这些描述我们可以得到日期、时间和内建常量的词法规则:

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
DATE_LITERAL    // 1996-09-26
    : '1'..'3' '0'..'9' '0'..'9' '0'..'9' '-' '0'..'1' '0'..'9' '-' '0'..'3' '0'..'9'
      {
          System.out.println("date>" + getText());
      }
    ;

TIME_LITERAL    // 00:00:00:000000
    : '0'..'2' '0'..'9' ':' '0'..'5' '0'..'9' ':' '0'..'5' '0'..'9'
      ( '.' '0'..'9'
      | '0'..'9' '0'..'9'
      | '0'..'9' '0'..'9' '0'..'9'
      | '0'..'9' '0'..'9' '0'..'9' '0'..'9'
      | '0'..'9' '0'..'9' '0'..'9' '0'..'9' '0'..'9'
      | '0'..'9' '0'..'9' '0'..'9' '0'..'9' '0'..'9' '0'..'9'
      )?
      {
          System.out.println("time>" + getText());
      }
    ;

ENUM_LITERAL
    : Letter (Letter|'0'..'9')* '!'
      {
          System.out.println("enum>" + getText());
      }
    ;

Comments