示例#1
0
文件: parser.go 项目: dsymonds/gotoc
func (p *parser) readEnum(enum *ast.Enum) *parseError {
	if err := p.readToken("enum"); err != nil {
		return err
	}
	enum.Position = p.cur.astPosition()

	tok := p.next()
	if tok.err != nil {
		return tok.err
	}
	enum.Name = tok.value // TODO: validate

	if err := p.readToken("{"); err != nil {
		return err
	}

	// Parse enum values
	for !p.done {
		tok := p.next()
		if tok.err != nil {
			return tok.err
		}
		if tok.value == "}" {
			// end of enum
			// A semicolon after an enum is optional.
			if err := p.readToken(";"); err != nil {
				p.back()
			}
			return nil
		}
		// TODO: verify tok.value is a valid enum value name.
		ev := new(ast.EnumValue)
		enum.Values = append(enum.Values, ev)
		ev.Position = tok.astPosition()
		ev.Name = tok.value // TODO: validate
		ev.Up = enum

		if err := p.readToken("="); err != nil {
			return err
		}

		tok = p.next()
		if tok.err != nil {
			return tok.err
		}
		// TODO: check that tok.value is a valid enum value number.
		num, err := strconv.ParseInt(tok.value, 10, 32)
		if err != nil {
			return p.errorf("bad enum number %q: %v", tok.value, err)
		}
		ev.Number = int32(num) // TODO: validate

		if err := p.readToken(";"); err != nil {
			return err
		}
	}

	return p.errorf("unexpected EOF while parsing enum")
}