|
- # 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)
|