# E03-S01: build the parser test PRG and a fresh D81 holding every grammar and # parser fixture. The fixture order must match tests/parser/parser-test.s. [CmdletBinding()] param() $ErrorActionPreference = "Stop" $project = Split-Path $PSScriptRoot -Parent Import-Module (Join-Path $PSScriptRoot "lib\Nova128Test.psm1") -Force $out = Join-Path $project "build\parser-test" New-Item -ItemType Directory -Force -Path $out | Out-Null $g = Join-Path $project "tests\grammar" $p = Join-Path $project "tests\parser" # disk name -> @(source, group, expect file) $script:ParserFixtures = [ordered]@{ "minimal.n8" = @("$g\accepted\minimal.n8", "accepted", $null) "decls.n8" = @("$g\accepted\decls.n8", "accepted", $null) "arrays.n8" = @("$g\accepted\arrays.n8", "accepted", $null) "exprs.n8" = @("$g\accepted\exprs.n8", "accepted", $null) "forward.n8" = @("$g\accepted\forward.n8", "accepted", $null) "nulls.n8" = @("$g\accepted\nulls.n8", "accepted", $null) "stmts.n8" = @("$g\accepted\stmts.n8", "accepted", $null) "badchar.n8" = @("$g\rejected\bad_char.n8", "rejected", "$g\rejected\bad_char.expect") "badclass.n8" = @("$g\rejected\bad_class.n8", "rejected", "$g\rejected\bad_class.expect") "badiface.n8" = @("$g\rejected\bad_iface.n8", "rejected", "$g\rejected\bad_iface.expect") "badmethod.n8" = @("$g\rejected\bad_method.n8", "rejected", "$g\rejected\bad_method.expect") "dupdecl.n8" = @("$g\rejected\dup_decl.n8", "rejected", "$g\rejected\dup_decl.expect") "ifacebody.n8" = @("$g\rejected\iface_body.n8", "rejected", "$g\rejected\iface_body.expect") "linecont.n8" = @("$g\rejected\line_cont.n8", "pending", "$g\rejected\line_cont.expect") "missclass.n8" = @("$g\rejected\miss_class.n8", "rejected", "$g\rejected\miss_class.expect") "missend.n8" = @("$g\rejected\miss_end.n8", "rejected", "$g\rejected\miss_end.expect") "missif.n8" = @("$g\rejected\miss_if.n8", "rejected", "$g\rejected\miss_if.expect") "missmeth.n8" = @("$g\rejected\miss_meth.n8", "rejected", "$g\rejected\miss_meth.expect") "multistmt.n8" = @("$g\rejected\multi_stmt.n8", "pending", "$g\rejected\multi_stmt.expect") "order.n8" = @("$p\order.n8", "exact", "$p\order.expect") "unknown.n8" = @("$p\unknown.n8", "exact", "$p\unknown.expect") "recover.n8" = @("$p\recover.n8", "exact", "$p\recover.expect") "noprog.n8" = @("$p\noprog.n8", "exact", "$p\noprog.expect") "eofclass.n8" = @("$p\eofclass.n8", "exact", "$p\eofclass.expect") } $link = Invoke-Nova128Link -Name "parser-test" -BuildDir $out ` -Config (Join-Path $project "cfg\compiler.cfg") -Sources @( (Join-Path $project "src\compiler\mmu.s"), (Join-Path $project "src\compiler\diskio.s"), (Join-Path $project "src\compiler\source.s"), (Join-Path $project "src\compiler\lexer.s"), (Join-Path $project "src\compiler\names.s"), (Join-Path $project "src\compiler\diagnostics.s"), (Join-Path $project "src\compiler\parser.s"), (Join-Path $project "tests\parser\parser-test.s")) if ((Get-Nova128Label $link.Labels "test_entry") -ne 0x1C0D) { throw "test_entry is not at `$1C0D" } $files = @(@{ Name = "parser-test"; Path = $link.Program; Type = "prg" }) foreach ($name in $ParserFixtures.Keys) { $pet = Join-Path $out ($name -replace '\.n8$', '.pet') [IO.File]::WriteAllBytes($pet, (ConvertTo-Nova128Petscii (Get-Content -Raw -LiteralPath $ParserFixtures[$name][0]))) $files += @{ Name = $name; Path = $pet; Type = "seq" } } New-Nova128Disk -Path (Join-Path $out "parser-test.d81") -Files $files Write-Host ("built {0}; {1} fixtures on parser-test.d81" -f $link.Program, $ParserFixtures.Count)