# E03-S01..E03-S04: build the parser test PRG and a fresh D81 holding every grammar, # parser, and semantic 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" $t = Join-Path $project "tests\semantic" # 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", "rejected", "$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", "rejected", "$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") "members.n8" = @("$p\members.n8", "exact", "$p\members.expect") "lifecycle.n8" = @("$p\lifecycle.n8", "exact", "$p\lifecycle.expect") "scopes.n8" = @("$p\scopes.n8", "exact", "$p\scopes.expect") "private.n8" = @("$p\private.n8", "exact", "$p\private.expect") "prec.n8" = @("$p\prec.n8", "accepted", "$p\prec.expect") "forms.n8" = @("$p\forms.n8", "accepted", $null) "syntax.n8" = @("$p\syntax.n8", "exact", "$p\syntax.expect") "typesok.n8" = @("$t\types_ok.n8", "accepted", $null) "convert.n8" = @("$t\convert.n8", "exact", "$t\convert.expect") "refs.n8" = @("$t\refs.n8", "exact", "$t\refs.expect") "ops.n8" = @("$t\ops.n8", "exact", "$t\ops.expect") "uses.n8" = @("$t\uses.n8", "exact", "$t\uses.expect") "calls.n8" = @("$t\calls.n8", "exact", "$t\calls.expect") "layout.n8" = @("$t\layout.n8", "layout", "$t\layout.expect") "toobig.n8" = @("$t\too_big.n8", "rejected", "$t\too_big.expect") "interfaces.n8" = @("$t\interfaces.n8", "iface", "$t\interfaces.expect") "ifacebad.n8" = @("$t\iface_bad.n8", "exact", "$t\iface_bad.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 "src\compiler\interfaces.s"), (Join-Path $project "src\compiler\types.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)