separate number into float and integer
This commit is contained in:
parent
10f55313b0
commit
daab50d54c
22 changed files with 848 additions and 428 deletions
|
|
@ -55,9 +55,9 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
[]Token{
|
||||
NewToken(TokenName, 0, 1, 0, "_"),
|
||||
NewToken(TokenAssign, 1, 1, 0, "="),
|
||||
NewToken(TokenNumber, 3, 1, 0, "1"),
|
||||
NewToken(TokenFloat, 3, 1, 0, "1"),
|
||||
NewToken(TokenPlus, 4, 1, 0, "+"),
|
||||
NewToken(TokenNumber, 5, 1, 0, "2"),
|
||||
NewToken(TokenFloat, 5, 1, 0, "2"),
|
||||
NewToken(TokenEOF, 6, 0, 0, ""),
|
||||
},
|
||||
&BlockNode{
|
||||
|
|
@ -66,11 +66,11 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
"_",
|
||||
&BinaryNode{
|
||||
BinaryAddition,
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
1,
|
||||
0, 0,
|
||||
},
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
2,
|
||||
0, 0,
|
||||
},
|
||||
|
|
@ -110,7 +110,7 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
[]Token{
|
||||
NewToken(TokenName, 0, 1, 0, "a"),
|
||||
NewToken(TokenDeclare, 1, 2, 0, ":="),
|
||||
NewToken(TokenNumber, 3, 1, 0, "1"),
|
||||
NewToken(TokenFloat, 3, 1, 0, "1"),
|
||||
NewToken(TokenPlus, 4, 1, 0, "+"),
|
||||
NewToken(TokenName, 5, 1, 0, "b"),
|
||||
NewToken(TokenEOF, 6, 0, 0, ""),
|
||||
|
|
@ -121,7 +121,7 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
"a",
|
||||
&BinaryNode{
|
||||
BinaryAddition,
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
1,
|
||||
0, 0,
|
||||
},
|
||||
|
|
@ -145,28 +145,28 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
NewToken(TokenAssign, 1, 2, 0, "="),
|
||||
|
||||
NewToken(TokenOpenParenthesis, 3, 1, 0, "("),
|
||||
NewToken(TokenNumber, 4, 1, 0, "2"),
|
||||
NewToken(TokenFloat, 4, 1, 0, "2"),
|
||||
NewToken(TokenPlus, 5, 1, 0, "+"),
|
||||
NewToken(TokenNumber, 6, 1, 0, "1"),
|
||||
NewToken(TokenFloat, 6, 1, 0, "1"),
|
||||
NewToken(TokenCloseParenthesis, 7, 1, 0, ")"),
|
||||
NewToken(TokenStar, 8, 1, 0, "*"),
|
||||
NewToken(TokenNumber, 9, 1, 0, "5"),
|
||||
NewToken(TokenFloat, 9, 1, 0, "5"),
|
||||
|
||||
NewToken(TokenPlus, 10, 1, 0, "+"),
|
||||
|
||||
NewToken(TokenNumber, 11, 1, 0, "3"),
|
||||
NewToken(TokenFloat, 11, 1, 0, "3"),
|
||||
NewToken(TokenSlash, 12, 1, 0, "/"),
|
||||
NewToken(TokenOpenParenthesis, 13, 1, 0, "("),
|
||||
NewToken(TokenNumber, 14, 1, 0, "6"),
|
||||
NewToken(TokenFloat, 14, 1, 0, "6"),
|
||||
NewToken(TokenMinus, 15, 1, 0, "-"),
|
||||
NewToken(TokenNumber, 16, 1, 0, "2"),
|
||||
NewToken(TokenFloat, 16, 1, 0, "2"),
|
||||
NewToken(TokenCloseParenthesis, 17, 1, 0, ")"),
|
||||
|
||||
NewToken(TokenMinus, 18, 1, 0, "-"),
|
||||
|
||||
NewToken(TokenNumber, 19, 2, 0, "10"),
|
||||
NewToken(TokenFloat, 19, 2, 0, "10"),
|
||||
NewToken(TokenSlash, 20, 1, 0, "/"),
|
||||
NewToken(TokenNumber, 21, 1, 0, "2"),
|
||||
NewToken(TokenFloat, 21, 1, 0, "2"),
|
||||
NewToken(TokenEOF, 22, 0, 0, ""),
|
||||
},
|
||||
// (2 + 1) * 5 + 3 / (6 - 2) - 10 / 2
|
||||
|
|
@ -182,17 +182,17 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
BinaryMultiplication,
|
||||
&BinaryNode{
|
||||
BinaryAddition,
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
2,
|
||||
0, 0,
|
||||
},
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
1,
|
||||
0, 0,
|
||||
},
|
||||
0, 0,
|
||||
},
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
5,
|
||||
0, 0,
|
||||
},
|
||||
|
|
@ -200,17 +200,17 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
},
|
||||
&BinaryNode{
|
||||
BinaryDivision,
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
3,
|
||||
0, 0,
|
||||
},
|
||||
&BinaryNode{
|
||||
BinarySubtraction,
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
6,
|
||||
0, 0,
|
||||
},
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
2,
|
||||
0, 0,
|
||||
},
|
||||
|
|
@ -222,11 +222,11 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
},
|
||||
&BinaryNode{
|
||||
BinaryDivision,
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
10,
|
||||
0, 0,
|
||||
},
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
2,
|
||||
0, 0,
|
||||
},
|
||||
|
|
@ -245,9 +245,9 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
[]Token{
|
||||
NewToken(TokenName, 0, 1, 0, "_"),
|
||||
NewToken(TokenAssign, 1, 1, 0, "="),
|
||||
NewToken(TokenNumber, 2, 2, 0, "20"),
|
||||
NewToken(TokenFloat, 2, 2, 0, "20"),
|
||||
NewToken(TokenEquals, 4, 2, 0, "=="),
|
||||
NewToken(TokenNumber, 6, 2, 0, "15"),
|
||||
NewToken(TokenFloat, 6, 2, 0, "15"),
|
||||
NewToken(TokenEOF, 8, 0, 0, ""),
|
||||
},
|
||||
&BlockNode{
|
||||
|
|
@ -256,11 +256,11 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
"_",
|
||||
&BinaryNode{
|
||||
BinaryEquality,
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
20,
|
||||
0, 0,
|
||||
},
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
15,
|
||||
0, 0,
|
||||
},
|
||||
|
|
@ -278,11 +278,11 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
NewToken(TokenIf, 0, 2, 0, "if"),
|
||||
NewToken(TokenName, 2, 1, 0, "a"),
|
||||
NewToken(TokenEquals, 3, 2, 0, "=="),
|
||||
NewToken(TokenNumber, 5, 1, 0, "0"),
|
||||
NewToken(TokenFloat, 5, 1, 0, "0"),
|
||||
NewToken(TokenOpenBrace, 6, 1, 0, "{"),
|
||||
NewToken(TokenName, 7, 1, 1, "b"),
|
||||
NewToken(TokenAssign, 8, 1, 1, "="),
|
||||
NewToken(TokenNumber, 9, 1, 1, "1"),
|
||||
NewToken(TokenFloat, 9, 1, 1, "1"),
|
||||
NewToken(TokenCloseBrace, 10, 1, 2, "}"),
|
||||
NewToken(TokenEOF, 11, 0, 2, ""),
|
||||
},
|
||||
|
|
@ -295,7 +295,7 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
"a",
|
||||
0, 0,
|
||||
},
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
0,
|
||||
0, 0,
|
||||
},
|
||||
|
|
@ -305,7 +305,7 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
[]Node{
|
||||
&AssignNode{
|
||||
"b",
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
1,
|
||||
0, 0,
|
||||
},
|
||||
|
|
@ -325,17 +325,17 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
NewToken(TokenIf, 0, 2, 0, "if"),
|
||||
NewToken(TokenName, 2, 1, 0, "a"),
|
||||
NewToken(TokenEquals, 3, 2, 0, "=="),
|
||||
NewToken(TokenNumber, 5, 1, 0, "0"),
|
||||
NewToken(TokenFloat, 5, 1, 0, "0"),
|
||||
NewToken(TokenOpenBrace, 6, 1, 0, "{"),
|
||||
NewToken(TokenName, 7, 1, 1, "b"),
|
||||
NewToken(TokenAssign, 8, 1, 1, "="),
|
||||
NewToken(TokenNumber, 9, 1, 1, "1"),
|
||||
NewToken(TokenFloat, 9, 1, 1, "1"),
|
||||
NewToken(TokenCloseBrace, 10, 1, 2, "}"),
|
||||
NewToken(TokenElse, 11, 4, 2, "else"),
|
||||
NewToken(TokenOpenBrace, 15, 1, 2, "{"),
|
||||
NewToken(TokenName, 16, 1, 2, "b"),
|
||||
NewToken(TokenAssign, 17, 1, 2, "="),
|
||||
NewToken(TokenNumber, 18, 1, 2, "0"),
|
||||
NewToken(TokenFloat, 18, 1, 2, "0"),
|
||||
NewToken(TokenCloseBrace, 19, 1, 2, "}"),
|
||||
NewToken(TokenEOF, 20, 0, 2, ""),
|
||||
},
|
||||
|
|
@ -348,7 +348,7 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
"a",
|
||||
0, 0,
|
||||
},
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
0,
|
||||
0, 0,
|
||||
},
|
||||
|
|
@ -358,7 +358,7 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
[]Node{
|
||||
&AssignNode{
|
||||
"b",
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
1,
|
||||
0, 0,
|
||||
},
|
||||
|
|
@ -372,7 +372,7 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
[]Node{
|
||||
&AssignNode{
|
||||
"b",
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
0,
|
||||
0, 0,
|
||||
},
|
||||
|
|
@ -403,21 +403,22 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
0, 0,
|
||||
},
|
||||
},
|
||||
"lambda": { // a := func(a, b) { return a + b }
|
||||
"lambda": { // a := fn(a: float, b: float) -> float { return a + b }
|
||||
[]Token{
|
||||
NewToken(TokenName, 0, 1, 0, "a"),
|
||||
NewToken(TokenDeclare, 1, 2, 0, ":="),
|
||||
NewToken(TokenFunc, 3, 4, 0, "func"),
|
||||
NewToken(TokenOpenParenthesis, 7, 1, 0, "("),
|
||||
NewToken(TokenName, 8, 1, 0, "a"),
|
||||
NewToken(TokenColon, 9, 1, 0, ":"),
|
||||
NewToken(TokenName, 10, 5, 0, "number"),
|
||||
NewToken(TokenFunc, 3, 2, 0, "fn"),
|
||||
NewToken(TokenOpenParenthesis, 5, 1, 0, "("),
|
||||
NewToken(TokenName, 6, 1, 0, "a"),
|
||||
NewToken(TokenColon, 6, 1, 0, ":"),
|
||||
NewToken(TokenName, 10, 5, 0, "float"),
|
||||
NewToken(TokenComma, 9, 1, 0, ","),
|
||||
NewToken(TokenName, 10, 1, 0, "b"),
|
||||
NewToken(TokenColon, 9, 1, 0, ":"),
|
||||
NewToken(TokenName, 10, 5, 0, "number"),
|
||||
NewToken(TokenName, 10, 5, 0, "float"),
|
||||
NewToken(TokenCloseParenthesis, 11, 1, 0, ")"),
|
||||
NewToken(TokenName, 10, 5, 0, "number"),
|
||||
NewToken(TokenArrow, 12, 1, 0, "->"),
|
||||
NewToken(TokenName, 10, 5, 0, "float"),
|
||||
|
||||
NewToken(TokenOpenBrace, 12, 1, 1, "{"),
|
||||
NewToken(TokenReturn, 13, 6, 1, "return"),
|
||||
|
|
@ -437,14 +438,14 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
[]FunctionParameter{
|
||||
{
|
||||
"a",
|
||||
&NumberSignature{},
|
||||
&FloatSignature{},
|
||||
},
|
||||
{
|
||||
"b",
|
||||
&NumberSignature{},
|
||||
&FloatSignature{},
|
||||
},
|
||||
},
|
||||
&NumberSignature{},
|
||||
&FloatSignature{},
|
||||
&BlockNode{
|
||||
[]Node{
|
||||
&ReturnNode{
|
||||
|
|
@ -476,13 +477,19 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
},
|
||||
"function_declaration": {
|
||||
[]Token{
|
||||
NewToken(TokenFunc, 0, 4, 0, "func"),
|
||||
NewToken(TokenFunc, 0, 2, 0, "fn"),
|
||||
NewToken(TokenName, 4, 3, 0, "a"),
|
||||
NewToken(TokenOpenParenthesis, 7, 1, 0, "("),
|
||||
NewToken(TokenName, 8, 1, 0, "a"),
|
||||
NewToken(TokenColon, 9, 1, 0, ":"),
|
||||
NewToken(TokenName, 8, 1, 0, "float"),
|
||||
NewToken(TokenComma, 9, 1, 0, ","),
|
||||
NewToken(TokenName, 10, 1, 0, "b"),
|
||||
NewToken(TokenColon, 9, 1, 0, ":"),
|
||||
NewToken(TokenName, 8, 1, 0, "float"),
|
||||
NewToken(TokenCloseParenthesis, 11, 1, 0, ")"),
|
||||
NewToken(TokenArrow, 9, 1, 0, "->"),
|
||||
NewToken(TokenName, 8, 1, 0, "float"),
|
||||
|
||||
NewToken(TokenOpenBrace, 12, 1, 1, "{"),
|
||||
NewToken(TokenReturn, 13, 6, 1, "return"),
|
||||
|
|
@ -502,14 +509,14 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
[]FunctionParameter{
|
||||
{
|
||||
"a",
|
||||
&NumberSignature{},
|
||||
&FloatSignature{},
|
||||
},
|
||||
{
|
||||
"b",
|
||||
&NumberSignature{},
|
||||
&FloatSignature{},
|
||||
},
|
||||
},
|
||||
&NumberSignature{},
|
||||
&FloatSignature{},
|
||||
&BlockNode{
|
||||
[]Node{
|
||||
&ReturnNode{
|
||||
|
|
@ -577,7 +584,7 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
NewToken(TokenName, 8, 1, 0, "a"),
|
||||
NewToken(TokenComma, 11, 1, 0, ","),
|
||||
|
||||
NewToken(TokenNumber, 8, 1, 0, "3.141"),
|
||||
NewToken(TokenFloat, 8, 1, 0, "3.141"),
|
||||
NewToken(TokenComma, 11, 1, 0, ","),
|
||||
|
||||
NewToken(TokenString, 6, 1, 0, "\"Hello world!\""),
|
||||
|
|
@ -587,10 +594,10 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
NewToken(TokenComma, 11, 1, 0, ","),
|
||||
|
||||
NewToken(TokenOpenBracket, 6, 1, 0, "["),
|
||||
NewToken(TokenNumber, 6, 1, 0, "2"),
|
||||
NewToken(TokenFloat, 6, 1, 0, "2"),
|
||||
NewToken(TokenComma, 11, 1, 0, ","),
|
||||
|
||||
NewToken(TokenNumber, 6, 1, 0, "3"),
|
||||
NewToken(TokenFloat, 6, 1, 0, "3"),
|
||||
NewToken(TokenCloseBracket, 6, 1, 0, "]"),
|
||||
|
||||
NewToken(TokenCloseBracket, 6, 1, 0, "]"),
|
||||
|
|
@ -607,7 +614,7 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
"a",
|
||||
0, 0,
|
||||
},
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
3.141,
|
||||
0, 0,
|
||||
},
|
||||
|
|
@ -622,10 +629,10 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
},
|
||||
&ListNode{
|
||||
[]Node{
|
||||
&NumberNode{
|
||||
&FloatNode{
|
||||
2,
|
||||
0, 0,
|
||||
}, &NumberNode{
|
||||
}, &FloatNode{
|
||||
3,
|
||||
0, 0,
|
||||
},
|
||||
|
|
@ -677,12 +684,20 @@ func NodeEquality(t *testing.T, n1 Node, n2 Node) {
|
|||
t.Logf("String node quoted values match (%s)", n1.(*StringNode).value)
|
||||
}
|
||||
|
||||
case NumberNodeType:
|
||||
if n1.(*NumberNode).value != n2.(*NumberNode).value {
|
||||
t.Errorf("Number node values don't match (%f and %f)", n1.(*NumberNode).value, n2.(*NumberNode).value)
|
||||
case FloatNodeType:
|
||||
if n1.(*FloatNode).value != n2.(*FloatNode).value {
|
||||
t.Errorf("Float node values don't match (%f and %f)", n1.(*FloatNode).value, n2.(*FloatNode).value)
|
||||
} else {
|
||||
t.Logf("Number node values match (%f)", n1.(*NumberNode).value)
|
||||
t.Logf("Float node values match (%f)", n1.(*FloatNode).value)
|
||||
}
|
||||
|
||||
case IntegerNodeType:
|
||||
if n1.(*IntegerNode).value.Cmp(n2.(*IntegerNode).value) != 0 {
|
||||
t.Errorf("Integer node values don't match (%d and %d)", n1.(*IntegerNode).value, n2.(*IntegerNode).value)
|
||||
} else {
|
||||
t.Logf("Integer node values match (%d)", n1.(*IntegerNode).value)
|
||||
}
|
||||
|
||||
case ReferenceNodeType:
|
||||
if n1.(*ReferenceNode).name != n2.(*ReferenceNode).name {
|
||||
t.Errorf("Reference node values don't match (%s and %s)", n1.(*ReferenceNode).name, n2.(*ReferenceNode).name)
|
||||
|
|
@ -795,6 +810,37 @@ func NodeEquality(t *testing.T, n1 Node, n2 Node) {
|
|||
|
||||
case ReturnNodeType:
|
||||
NodeEquality(t, n1.(*ReturnNode).value, n2.(*ReturnNode).value)
|
||||
|
||||
case AccessNodeType:
|
||||
a1 := n1.(*AccessNode)
|
||||
a2 := n2.(*AccessNode)
|
||||
|
||||
if a1.property != a2.property {
|
||||
t.Errorf("Access node property does not match: .%s != .%s", a1.property, a2.property)
|
||||
} else {
|
||||
t.Logf("Access node property matches: .%s", a1.property)
|
||||
}
|
||||
|
||||
NodeEquality(t, a1.source, a2.source)
|
||||
|
||||
case ListNodeType:
|
||||
l1 := n1.(*ListNode)
|
||||
l2 := n2.(*ListNode)
|
||||
|
||||
if l1.content == nil && l2.content == nil {
|
||||
// fine
|
||||
t.Logf("Both content types are yet to be determined")
|
||||
} else if l1.content != nil || l2.content != nil {
|
||||
t.Errorf("one is nil, one is not")
|
||||
} else if !l1.content.Matches(l2.content) {
|
||||
t.Errorf("signature doesn't match")
|
||||
}
|
||||
|
||||
for i, v1 := range l1.items {
|
||||
t.Logf("Checking item %d", i)
|
||||
NodeEquality(t, v1, l2.items[i])
|
||||
}
|
||||
|
||||
default:
|
||||
panic("unimplemented node equality")
|
||||
}
|
||||
|
|
@ -818,7 +864,7 @@ func SerializeTokens(tokens []Token) string {
|
|||
out.WriteString("!")
|
||||
case TokenSemicolon:
|
||||
out.WriteString(";")
|
||||
case TokenNumber:
|
||||
case TokenFloat:
|
||||
out.WriteString(token.Lexeme)
|
||||
case TokenString:
|
||||
out.WriteString(fmt.Sprintf("\"%s\"", token.Lexeme))
|
||||
|
|
@ -845,7 +891,7 @@ func SerializeTokens(tokens []Token) string {
|
|||
case TokenNil:
|
||||
out.WriteString("nil")
|
||||
case TokenFunc:
|
||||
out.WriteString("func")
|
||||
out.WriteString("fn")
|
||||
case TokenReturn:
|
||||
out.WriteString("return ")
|
||||
case TokenWhile:
|
||||
|
|
@ -904,10 +950,6 @@ func TestParser_Parse(t *testing.T) {
|
|||
tokenData := GetTokenTestData()
|
||||
|
||||
for name, data := range tokenData {
|
||||
if name != "empty_block" && name != "lambda" {
|
||||
continue
|
||||
}
|
||||
|
||||
t.Run(name, func(t *testing.T) {
|
||||
t.Logf("Initializing parser")
|
||||
p := NewParser("", []string{}, data.tokens)
|
||||
|
|
@ -916,7 +958,7 @@ func TestParser_Parse(t *testing.T) {
|
|||
tree, err := p.Parse("")
|
||||
|
||||
if err != nil {
|
||||
t.Fatalf("Unexpected error(s): %s", err.(ParsingError).Format())
|
||||
t.Fatalf("Unexpected error(s): %s", err.(ParsingError).Description)
|
||||
}
|
||||
|
||||
t.Logf("Checking parsed tree")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue