Skip to content

Commit

Permalink
fix: printing for ast giving segmentation violation
Browse files Browse the repository at this point in the history
  • Loading branch information
gravataLonga committed Jun 28, 2022
1 parent db224a3 commit 6e08057
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 3 deletions.
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@ go build -o ninja-lang

For more detail about language, you can check [here](https://ninja.jonathan.pt) (Still working in progress).

# Demo

Resolving katas you can check this repository
https://adventofcode.com/2015

# Syntax

## Variable
Expand Down
21 changes: 18 additions & 3 deletions ast/for_statement.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,26 @@ func (fs *ForStatement) String() string {
out.WriteString(string(fs.TokenLiteral()) + " ")

out.WriteString("(")
out.WriteString(fs.InitialCondition.String() + ";")
out.WriteString(fs.Condition.String() + ";")
out.WriteString(fs.Iteration.String())
if fs.InitialCondition != nil {
out.WriteString(fs.InitialCondition.String())
} else {
out.WriteString(";")
}

if fs.Condition != nil {
out.WriteString(fs.Condition.String() + ";")
} else {
out.WriteString(";")
}

if fs.Iteration != nil {
out.WriteString(fs.Iteration.String())
}

out.WriteString(") ")
out.WriteString("{")
out.WriteString(fs.Body.String())
out.WriteString("}")

return out.String()
}
3 changes: 3 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ var version string

func main() {
exec := flag.StringP("exec", "e", "", "Runs the given code.")
_ = flag.BoolP("ast", "a", false, "Return AST structure")

flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Version: %s. \nUsage: ninja [flags] [program file] [arguments]\n\nAvailable flags:\n", version)
Expand Down Expand Up @@ -64,6 +65,8 @@ func execCode(input string, writer io.Writer) {
return
}

fmt.Println(program.String())

evaluated := evaluator.Eval(program, env)
if evaluated != nil {
fmt.Fprintf(writer, evaluated.Inspect())
Expand Down
43 changes: 43 additions & 0 deletions parser/for_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,46 @@ func TestForStatement(t *testing.T) {
}
}
}

func TestForStatement_String(t *testing.T) {
tests := []struct {
input string
expected string
}{
{
`for(var i = 0; i <= 3; i = i + 1) { }`,
`for (var i = 0;(i <= 3);i = (i + 1);) {}`,
},
{
`for(var i = 0; i <= 3; i = i + 1) { puts(1); }`,
`for (var i = 0;(i <= 3);i = (i + 1);) {puts(1)}`,
},
{
`for(; i <= 3; i = i + 1) { puts(1); }`,
`for (;(i <= 3);i = (i + 1);) {puts(1)}`,
},
{
`for(var i = 0;; i = i + 1) { puts(1); }`,
`for (var i = 0;;i = (i + 1);) {puts(1)}`,
},
{
`for(var i = 0; i <= 3;) { puts(1); }`,
`for (var i = 0;(i <= 3);) {puts(1)}`,
},
{
`for(;;) { puts(1); }`,
`for (;;) {puts(1)}`,
},
}

for _, tt := range tests {
l := lexer.New(tt.input)
p := New(l)
program := p.ParseProgram()
checkParserErrors(t, p)

if program.String() != tt.expected {
t.Errorf("ForStatement.string() expected %s. Got: %s", tt.expected, program.String())
}
}
}

0 comments on commit 6e08057

Please sign in to comment.