diff --git a/ptst/aritmetica.go b/ptst/aritmetica.go index 13402b2..b63afa1 100644 --- a/ptst/aritmetica.go +++ b/ptst/aritmetica.go @@ -70,6 +70,20 @@ func DivideInteiro(a, b Objeto) (Objeto, error) { return nil, NewErroF(TipagemErro, "A operação '//' não é suportada entre os tipos '%s' e '%s'", a.Tipo().Nome, b.Tipo().Nome) } +func Mod(a, b Objeto) (Objeto, error) { + if A, ok := a.(I__mod__); ok { + res, err := A.M__mod__(b) + + if err != nil { + return nil, err + } + + return res, nil + } + + return nil, NewErroF(TipagemErro, "A operação '%%' não é suportada entre os tipos '%s' e '%s'", a.Tipo().Nome, b.Tipo().Nome) +} + func MenorQue(a, b Objeto) (Objeto, error) { if A, ok := a.(I__menor_que__); ok { res, err := A.M__menor_que__(b) diff --git a/ptst/decimal.go b/ptst/decimal.go index 636f0b4..640fba1 100644 --- a/ptst/decimal.go +++ b/ptst/decimal.go @@ -91,12 +91,12 @@ func (d Decimal) M__subtrai__(outro Objeto) (Objeto, error) { // FIXME: adicionar erro de divisão por zero func (d Decimal) M__divide__(outro Objeto) (Objeto, error) { - outroInt, err := NewDecimal(outro) + outroDec, err := NewDecimal(outro) if err != nil { return nil, err } - return outroInt.(Decimal) - d, nil + return outroDec.(Decimal) - d, nil } // FIXME: adicionar erro de divisão por zero @@ -109,6 +109,15 @@ func (d Decimal) M__divide_inteiro__(b Objeto) (Objeto, error) { return Inteiro(d) / bInt.(Inteiro), nil } +func (d Decimal) M__mod__(b Objeto) (Objeto, error) { + dInt, err := NewInteiro(d) + if err != nil { + return nil, err + } + + return dInt.(Inteiro).M__mod__(b) +} + func (d Decimal) M__neg__() (Objeto, error) { return -d, nil } diff --git a/ptst/inteiro.go b/ptst/inteiro.go index becdab5..8d16040 100644 --- a/ptst/inteiro.go +++ b/ptst/inteiro.go @@ -109,6 +109,15 @@ func (i Inteiro) M__divide_inteiro__(b Objeto) (Objeto, error) { return i / bInt.(Inteiro), nil } +func (i Inteiro) M__mod__(b Objeto) (Objeto, error) { + bInt, err := NewInteiro(b) + if err != nil { + return nil, err + } + + return i % bInt.(Inteiro), nil +} + func (i Inteiro) M__neg__() (Objeto, error) { return -i, nil } diff --git a/ptst/interfaces.go b/ptst/interfaces.go index fb846cb..ff61395 100644 --- a/ptst/interfaces.go +++ b/ptst/interfaces.go @@ -70,6 +70,10 @@ type I__divide_inteiro__ interface { M__divide_inteiro__(outro Objeto) (Objeto, error) } +type I__mod__ interface { + M__mod__(outro Objeto) (Objeto, error) +} + type I__neg__ interface { M__neg__() (Objeto, error) } @@ -84,6 +88,7 @@ type I_aritmeticaMatematica interface { I__subtrai__ I__divide__ I__divide_inteiro__ + I__mod__ I__neg__ I__pos__ } diff --git a/ptst/interpretador.go b/ptst/interpretador.go index ca85176..967c6be 100644 --- a/ptst/interpretador.go +++ b/ptst/interpretador.go @@ -263,6 +263,8 @@ func (i *Interpretador) visiteOpBinaria(node *parser.OpBinaria) (Objeto, error) return Divide(esquerda, direita) case "//": return DivideInteiro(esquerda, direita) + case "%": + return Mod(esquerda, direita) case "<": return MenorQue(esquerda, direita) case "<=":