第二部分

图9-6 展示了这两个同等类型定义所生成的符号表项和类型说明。此图展示了数组元素类型是怎样通过与数组类型说明的ARRAY_ELEMENT_TYPE属性值联系在一起的。

(基于Java)编写编译器和解释器-第9章:解析声明-第三部分(连载)

两种定义格式不一样,但是生成同样的符号表项与类型说明配置。遵照图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:    }

相关文章:

  • 2021-07-05
  • 2021-11-20
  • 2021-12-07
  • 2021-07-28
  • 2021-10-27
  • 2021-10-16
  • 2021-10-16
  • 2021-08-05
猜你喜欢
  • 2021-12-10
  • 2021-11-27
  • 2021-08-13
  • 2022-01-30
  • 2021-07-25
  • 2021-12-31
  • 2022-02-21
相关资源
相似解决方案