Skip to content

Commit

Permalink
merge: Merge pull request #31 from natanfeitosa/feat/operacao-modulo
Browse files Browse the repository at this point in the history
feat(ptst): adiciona o operador de módulo da divisao %
  • Loading branch information
natanfeitosa authored Feb 19, 2024
2 parents df7dec4 + 34e6a9d commit 379985e
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 2 deletions.
14 changes: 14 additions & 0 deletions ptst/aritmetica.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
13 changes: 11 additions & 2 deletions ptst/decimal.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
}
Expand Down
9 changes: 9 additions & 0 deletions ptst/inteiro.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
5 changes: 5 additions & 0 deletions ptst/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand All @@ -84,6 +88,7 @@ type I_aritmeticaMatematica interface {
I__subtrai__
I__divide__
I__divide_inteiro__
I__mod__
I__neg__
I__pos__
}
Expand Down
2 changes: 2 additions & 0 deletions ptst/interpretador.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 "<=":
Expand Down

0 comments on commit 379985e

Please sign in to comment.