Esempio n. 1
0
// register = <general-register> | [ <access-mode> ] <control-register> .
func (p *Parser) parseRegister() (er compiler.Node) {
	r := &compiler.RegisterNode{Position: p.pos}
	switch p.k {
	case '&', '|', '^':
		// access modes for control register.
		r.Kind = util.ControlRegisterKind & util.ControlModes[p.k]
		p.next()
		if err := p.lmexpect(lexer.REGISTER); err != nil {
			return nil
		}
		k, n, ok := util.Reginfo(p.lit)
		switch {
		case !ok:
			er = p.errorf("bad register: %s (%d,%d)", p.lit, k, n)
			return
		case k != util.ControlRegisterKind:
			er = p.errorf("register is not control: %s", p.lit)
			return
		}
		r.Index = n
	case '=':
		p.next()
		fallthrough
	default:
		if p.k != lexer.REGISTER {
			return nil
		}
		// TODO: get rid of repeating somehow.
		k, n, ok := util.Reginfo(p.lit)
		if !ok {
			er = p.errorf("bad register: %s (%d,%d)", p.lit, k, n)
			return
		}
		r.Kind = k
		r.Index = n
	}
	p.next()
	return r
}
Esempio n. 2
0
func registerp(s string) (ok bool) {
	_, _, ok = util.Reginfo(s)
	return
}