Skip to content

Commit

Permalink
fixed parser
Browse files Browse the repository at this point in the history
  • Loading branch information
ascandone committed Feb 12, 2025
1 parent 1763302 commit 22dfd5f
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 75 deletions.
3 changes: 2 additions & 1 deletion internal/parser/ast.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ type (

PercentageLiteral struct {
Range
Amount *big.Int
Amount *big.Int
FloatingDigits uint16
}

Variable struct {
Expand Down
90 changes: 16 additions & 74 deletions internal/parser/parser.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package parser

import (
"math"
"math/big"
"strconv"
"strings"
Expand Down Expand Up @@ -215,59 +214,36 @@ func parseSource(sourceCtx parser.ISourceContext) Source {
}
}

func unsafeParseBigInt(s string) *big.Int {
s = strings.TrimSpace(s)
i, ok := new(big.Int).SetString(s, 10)
if !ok {
panic("invalid int: " + s)
}
return i
}

func parseRatio(source string, range_ Range) *RatioLiteral {
split := strings.Split(source, "/")

num := unsafeParseBigInt(split[0])
den := unsafeParseBigInt(split[1])

return &RatioLiteral{
Range: range_,
Numerator: num,
Denominator: den,
}
}

// TODO actually handle big int
func ParsePercentageRatio(source string) (*big.Int, *big.Int, error) {
func ParsePercentageRatio(source string) (*big.Int, uint16, error) {
str := strings.TrimSuffix(source, "%")
num, err := strconv.ParseUint(strings.Replace(str, ".", "", -1), 0, 64)
if err != nil {
return nil, nil, err
return nil, 0, err
}

var denominator uint64
var floatingDigits uint16
split := strings.Split(str, ".")
if len(split) > 1 {
// TODO verify this is always correct
floatingDigits := len(split[1])
denominator = (uint64)(math.Pow10(2 + floatingDigits))
floatingDigits = uint16(len(split[1]))
} else {
denominator = 100
floatingDigits = 0
}

return big.NewInt(int64(num)), big.NewInt(int64(denominator)), nil
return big.NewInt(int64(num)), floatingDigits, nil
}

func parsePercentageRatio(source string, range_ Range) *RatioLiteral {
num, denominator, err := ParsePercentageRatio(source)
func parsePercentageRatio(source string, range_ Range) *PercentageLiteral {
num, floatingDigits, err := ParsePercentageRatio(source)
if err != nil {
panic(err)
}

return &RatioLiteral{
Range: range_,
Numerator: num,
Denominator: denominator,
return &PercentageLiteral{
Range: range_,
Amount: num,
FloatingDigits: floatingDigits,
}
}

Expand Down Expand Up @@ -321,8 +297,8 @@ func parseValueExpr(valueExprCtx parser.IValueExprContext) ValueExpr {
case *parser.NumberLiteralContext:
return parseNumberLiteral(valueExprCtx.NUMBER())

case *parser.PortionLiteralContext:
return parsePortionSource(valueExprCtx.Portion())
case *parser.PercentagePortionLiteralContext:
return parsePercentageRatio(valueExprCtx.GetText(), ctxToRange(valueExprCtx))

case *parser.VariableExprContext:
return variableLiteralFromCtx(valueExprCtx)
Expand Down Expand Up @@ -356,22 +332,6 @@ func variableLiteralFromCtx(ctx antlr.ParserRuleContext) *Variable {
}
}

func parsePortionSource(portionCtx parser.IPortionContext) *RatioLiteral {
switch portionCtx.(type) {
case *parser.RatioContext:
return parseRatio(portionCtx.GetText(), ctxToRange(portionCtx))

case *parser.PercentageContext:
return parsePercentageRatio(portionCtx.GetText(), ctxToRange(portionCtx))

case *parser.PortionContext:
return nil

default:
return utils.NonExhaustiveMatchPanic[*RatioLiteral](portionCtx.GetText())
}
}

func parseDestination(destCtx parser.IDestinationContext) Destination {
if destCtx == nil {
return nil
Expand Down Expand Up @@ -460,10 +420,8 @@ func parseDestinationAllotment(allotmentCtx parser.IAllotmentContext) AllotmentV
}

case *parser.PortionedAllotmentContext:
return parseDestinationPortion(allotmentCtx.Portion())

case *parser.PortionVariableContext:
return variableLiteralFromCtx(allotmentCtx)
expr := parseValueExpr(allotmentCtx.ValueExpr())
return &ValueExprAllotment{ValueExpr: expr}

case *parser.AllotmentContext:
return nil
Expand All @@ -473,22 +431,6 @@ func parseDestinationAllotment(allotmentCtx parser.IAllotmentContext) AllotmentV
}
}

func parseDestinationPortion(portionCtx parser.IPortionContext) AllotmentValue {
switch portionCtx.(type) {
case *parser.RatioContext:
return parseRatio(portionCtx.GetText(), ctxToRange(portionCtx))

case *parser.PercentageContext:
return parsePercentageRatio(portionCtx.GetText(), ctxToRange(portionCtx))

case *parser.PortionContext:
return nil

default:
return utils.NonExhaustiveMatchPanic[AllotmentValue](portionCtx.GetText())
}
}

func parseFnArgs(fnCallArgCtx parser.IFunctionCallArgsContext) []ValueExpr {
if fnCallArgCtx == nil {
return nil
Expand Down

0 comments on commit 22dfd5f

Please sign in to comment.