续 第二部分
图9-6 展示了这两个同等类型定义所生成的符号表项和类型说明。此图展示了数组元素类型是怎样通过与数组类型说明的ARRAY_ELEMENT_TYPE属性值联系在一起的。
两种定义格式不一样,但是生成同样的符号表项与类型说明配置。遵照图9-3的惯例,SymTabEntry对象以亮灰色而TypeSepc对象以暗灰显示。属性值ARRAY_ELEMENT_TYPE是带加粗箭头的连线。在Pascal中,字符'a'和'z'的序数值分别是97和122。
清单9-26 展示了类型说明解析子类ArrayTypeParser中的parse方法。
//数组 左方括号之后的同步集
final EnumSet<PascalTokenType> LEFT_BRACKET_SET =
3: SimpleTypeParser.SIMPLE_TYPE_START_SET.clone();
static {
5: LEFT_BRACKET_SET.add(LEFT_BRACKET);
6: LEFT_BRACKET_SET.add(RIGHT_BRACKET);
7: }
8:
// 右方括号之后的同步集
final EnumSet<PascalTokenType> RIGHT_BRACKET_SET =
11: EnumSet.of(RIGHT_BRACKET, OF, SEMICOLON);
12:
// 相当于元素类型的同步集
final EnumSet<PascalTokenType> OF_SET =
15: TypeSpecificationParser.TYPE_START_SET.clone();
static {
17: OF_SET.add(OF);
18: OF_SET.add(SEMICOLON);
19: }
20:
public TypeSpec parse(Token token)
throws Exception
23: {
24: TypeSpec arrayType = TypeFactory.createType(ARRAY);
//剔掉ARRAY关键字
26:
//在左括号出同步一下
28: token = synchronize(LEFT_BRACKET_SET);
if (token.getType() != LEFT_BRACKET) {
this);
31: }
32:
// 解析索引类型
34: TypeSpec elementType = parseIndexTypeList(token, arrayType);
35:
// 在右括号出同步一下
37: token = synchronize(RIGHT_BRACKET_SET);
if (token.getType() == RIGHT_BRACKET) {
39: token = nextToken();
40: }
else {
this);
43: }
44:
// 在OF处同步一下
46: token = synchronize(OF_SET);
if (token.getType() == OF) {
48: token = nextToken();
49: }
else {
this);
52: }
53:
// 然后是元素类型
55: elementType.setAttribute(ARRAY_ELEMENT_TYPE, parseElementType(token));
56:
return arrayType;
58: }