@jhlagado/azm 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +110 -78
- package/dist/src/api-compile.d.ts +0 -2
- package/dist/src/api-compile.js +2 -9
- package/dist/src/assembly/address-planning.js +21 -1
- package/dist/src/assembly/program-emission.js +1 -0
- package/dist/src/cli/parse-args.d.ts +0 -1
- package/dist/src/cli/parse-args.js +0 -7
- package/dist/src/cli/write-artifacts.js +0 -11
- package/dist/src/core/compile.js +192 -9
- package/dist/src/expansion/op-expansion.js +2 -0
- package/dist/src/model/expression.d.ts +4 -0
- package/dist/src/model/source-item.d.ts +11 -0
- package/dist/src/outputs/index.js +0 -2
- package/dist/src/outputs/types.d.ts +3 -16
- package/dist/src/outputs/write-asm80.js +206 -5
- package/dist/src/register-care/analyze.js +36 -8
- package/dist/src/register-care/annotations.js +33 -146
- package/dist/src/register-care/fix.d.ts +2 -0
- package/dist/src/register-care/fix.js +52 -0
- package/dist/src/register-care/instruction-shape.d.ts +11 -0
- package/dist/src/register-care/instruction-shape.js +129 -0
- package/dist/src/register-care/liveness.js +15 -7
- package/dist/src/register-care/profiles.js +4 -0
- package/dist/src/register-care/programModel.js +79 -13
- package/dist/src/register-care/report.d.ts +2 -1
- package/dist/src/register-care/report.js +91 -34
- package/dist/src/register-care/routine-summaries.d.ts +6 -0
- package/dist/src/register-care/routine-summaries.js +89 -0
- package/dist/src/register-care/summaries.d.ts +3 -3
- package/dist/src/register-care/summaries.js +42 -75
- package/dist/{legacy-root-azm/src/registerCare → src/register-care}/summary.js +33 -51
- package/dist/src/register-care/types.d.ts +6 -1
- package/dist/src/semantics/expression-evaluation.d.ts +7 -3
- package/dist/src/semantics/expression-evaluation.js +57 -0
- package/dist/src/source/strip-line-comment.d.ts +2 -0
- package/dist/src/source/strip-line-comment.js +26 -0
- package/dist/src/syntax/directive-aliases.js +9 -10
- package/dist/src/syntax/parse-diagnostics.d.ts +12 -0
- package/dist/src/syntax/parse-diagnostics.js +18 -0
- package/dist/src/syntax/parse-expression.js +34 -9
- package/dist/src/syntax/parse-line.js +150 -54
- package/dist/src/tooling/case-style.js +3 -0
- package/docs/reference/cli.md +6 -4
- package/docs/reference/tooling-api.md +13 -9
- package/package.json +4 -6
- package/dist/legacy-root-azm/src/analysis.d.ts +0 -11
- package/dist/legacy-root-azm/src/analysis.js +0 -41
- package/dist/legacy-root-azm/src/compile.d.ts +0 -10
- package/dist/legacy-root-azm/src/compile.js +0 -186
- package/dist/legacy-root-azm/src/compileShared.d.ts +0 -3
- package/dist/legacy-root-azm/src/compileShared.js +0 -7
- package/dist/legacy-root-azm/src/diagnosticTypes.d.ts +0 -77
- package/dist/legacy-root-azm/src/diagnosticTypes.js +0 -53
- package/dist/legacy-root-azm/src/formats/index.d.ts +0 -7
- package/dist/legacy-root-azm/src/formats/index.js +0 -17
- package/dist/legacy-root-azm/src/formats/range.d.ts +0 -17
- package/dist/legacy-root-azm/src/formats/range.js +0 -45
- package/dist/legacy-root-azm/src/formats/types.d.ts +0 -283
- package/dist/legacy-root-azm/src/formats/types.js +0 -1
- package/dist/legacy-root-azm/src/formats/writeAsm80.d.ts +0 -6
- package/dist/legacy-root-azm/src/formats/writeAsm80.js +0 -86
- package/dist/legacy-root-azm/src/formats/writeBin.d.ts +0 -7
- package/dist/legacy-root-azm/src/formats/writeBin.js +0 -23
- package/dist/legacy-root-azm/src/formats/writeD8m.d.ts +0 -9
- package/dist/legacy-root-azm/src/formats/writeD8m.js +0 -245
- package/dist/legacy-root-azm/src/formats/writeHex.d.ts +0 -8
- package/dist/legacy-root-azm/src/formats/writeHex.js +0 -38
- package/dist/legacy-root-azm/src/formats/writeListing.d.ts +0 -8
- package/dist/legacy-root-azm/src/formats/writeListing.js +0 -83
- package/dist/legacy-root-azm/src/frontend/asm80/asmLine.d.ts +0 -39
- package/dist/legacy-root-azm/src/frontend/asm80/asmLine.js +0 -89
- package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.d.ts +0 -4
- package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.js +0 -94
- package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.js +0 -25
- package/dist/legacy-root-azm/src/frontend/ast.d.ts +0 -376
- package/dist/legacy-root-azm/src/frontend/ast.js +0 -1
- package/dist/legacy-root-azm/src/frontend/directiveAliases.d.ts +0 -14
- package/dist/legacy-root-azm/src/frontend/directiveAliases.js +0 -189
- package/dist/legacy-root-azm/src/frontend/grammarData.d.ts +0 -14
- package/dist/legacy-root-azm/src/frontend/grammarData.js +0 -65
- package/dist/legacy-root-azm/src/frontend/immExprUtils.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/immExprUtils.js +0 -12
- package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.d.ts +0 -17
- package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.js +0 -187
- package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.d.ts +0 -3
- package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.js +0 -73
- package/dist/legacy-root-azm/src/frontend/parseAsmStatements.d.ts +0 -6
- package/dist/legacy-root-azm/src/frontend/parseAsmStatements.js +0 -16
- package/dist/legacy-root-azm/src/frontend/parseAsmStream.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/parseAsmStream.js +0 -33
- package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.d.ts +0 -18
- package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.js +0 -34
- package/dist/legacy-root-azm/src/frontend/parseDiagnostics.d.ts +0 -9
- package/dist/legacy-root-azm/src/frontend/parseDiagnostics.js +0 -16
- package/dist/legacy-root-azm/src/frontend/parseEnum.d.ts +0 -12
- package/dist/legacy-root-azm/src/frontend/parseEnum.js +0 -70
- package/dist/legacy-root-azm/src/frontend/parseImm.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/parseImm.js +0 -397
- package/dist/legacy-root-azm/src/frontend/parseLogicalLines.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parseLogicalLines.js +0 -94
- package/dist/legacy-root-azm/src/frontend/parseOp.d.ts +0 -25
- package/dist/legacy-root-azm/src/frontend/parseOp.js +0 -120
- package/dist/legacy-root-azm/src/frontend/parseOpHeader.d.ts +0 -20
- package/dist/legacy-root-azm/src/frontend/parseOpHeader.js +0 -32
- package/dist/legacy-root-azm/src/frontend/parseOperands.d.ts +0 -4
- package/dist/legacy-root-azm/src/frontend/parseOperands.js +0 -290
- package/dist/legacy-root-azm/src/frontend/parseParams.d.ts +0 -6
- package/dist/legacy-root-azm/src/frontend/parseParams.js +0 -62
- package/dist/legacy-root-azm/src/frontend/parseParserRecovery.d.ts +0 -12
- package/dist/legacy-root-azm/src/frontend/parseParserRecovery.js +0 -17
- package/dist/legacy-root-azm/src/frontend/parseParserShared.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/parseParserShared.js +0 -8
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.d.ts +0 -1
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.js +0 -3
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.d.ts +0 -7
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.js +0 -142
- package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.d.ts +0 -34
- package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.js +0 -177
- package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.d.ts +0 -46
- package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.js +0 -53
- package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.d.ts +0 -16
- package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.js +0 -68
- package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.js +0 -50
- package/dist/legacy-root-azm/src/frontend/parseTypes.d.ts +0 -24
- package/dist/legacy-root-azm/src/frontend/parseTypes.js +0 -77
- package/dist/legacy-root-azm/src/frontend/parser.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parser.js +0 -88
- package/dist/legacy-root-azm/src/frontend/source.d.ts +0 -28
- package/dist/legacy-root-azm/src/frontend/source.js +0 -58
- package/dist/legacy-root-azm/src/frontend/sourceExtensions.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/sourceExtensions.js +0 -6
- package/dist/legacy-root-azm/src/lintCaseStyle.d.ts +0 -4
- package/dist/legacy-root-azm/src/lintCaseStyle.js +0 -129
- package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.js +0 -229
- package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.d.ts +0 -47
- package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.js +0 -52
- package/dist/legacy-root-azm/src/lowering/asmEquResolution.d.ts +0 -8
- package/dist/legacy-root-azm/src/lowering/asmEquResolution.js +0 -69
- package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.js +0 -102
- package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.js +0 -54
- package/dist/legacy-root-azm/src/lowering/asmInstructionStream.d.ts +0 -46
- package/dist/legacy-root-azm/src/lowering/asmInstructionStream.js +0 -51
- package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.d.ts +0 -43
- package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.js +0 -254
- package/dist/legacy-root-azm/src/lowering/asmLoweringHost.d.ts +0 -23
- package/dist/legacy-root-azm/src/lowering/asmLoweringHost.js +0 -1
- package/dist/legacy-root-azm/src/lowering/asmLoweringLd.d.ts +0 -28
- package/dist/legacy-root-azm/src/lowering/asmLoweringLd.js +0 -144
- package/dist/legacy-root-azm/src/lowering/asmRangeLowering.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/asmRangeLowering.js +0 -39
- package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.d.ts +0 -16
- package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.js +0 -209
- package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.js +0 -9
- package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.js +0 -14
- package/dist/legacy-root-azm/src/lowering/asmUtils.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/asmUtils.js +0 -105
- package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.d.ts +0 -54
- package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.js +0 -128
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.d.ts +0 -151
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.js +0 -16
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.js +0 -75
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.d.ts +0 -66
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.js +0 -166
- package/dist/legacy-root-azm/src/lowering/bytePlacement.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/bytePlacement.js +0 -37
- package/dist/legacy-root-azm/src/lowering/capabilities.d.ts +0 -67
- package/dist/legacy-root-azm/src/lowering/capabilities.js +0 -1
- package/dist/legacy-root-azm/src/lowering/eaResolution.d.ts +0 -58
- package/dist/legacy-root-azm/src/lowering/eaResolution.js +0 -159
- package/dist/legacy-root-azm/src/lowering/emissionCore.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/emissionCore.js +0 -21
- package/dist/legacy-root-azm/src/lowering/emit.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/emit.js +0 -46
- package/dist/legacy-root-azm/src/lowering/emitContextBuilder.d.ts +0 -63
- package/dist/legacy-root-azm/src/lowering/emitContextBuilder.js +0 -41
- package/dist/legacy-root-azm/src/lowering/emitFinalization.d.ts +0 -61
- package/dist/legacy-root-azm/src/lowering/emitFinalization.js +0 -66
- package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.d.ts +0 -19
- package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.js +0 -26
- package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.js +0 -119
- package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.js +0 -12
- package/dist/legacy-root-azm/src/lowering/emitPhase1Types.d.ts +0 -21
- package/dist/legacy-root-azm/src/lowering/emitPhase1Types.js +0 -1
- package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.d.ts +0 -70
- package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.js +0 -203
- package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.d.ts +0 -82
- package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.js +0 -55
- package/dist/legacy-root-azm/src/lowering/emitPipeline.d.ts +0 -121
- package/dist/legacy-root-azm/src/lowering/emitPipeline.js +0 -57
- package/dist/legacy-root-azm/src/lowering/emitProgramContext.d.ts +0 -39
- package/dist/legacy-root-azm/src/lowering/emitProgramContext.js +0 -29
- package/dist/legacy-root-azm/src/lowering/emitState.d.ts +0 -90
- package/dist/legacy-root-azm/src/lowering/emitState.js +0 -124
- package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.js +0 -23
- package/dist/legacy-root-azm/src/lowering/fixupEmission.d.ts +0 -64
- package/dist/legacy-root-azm/src/lowering/fixupEmission.js +0 -199
- package/dist/legacy-root-azm/src/lowering/immMath.d.ts +0 -2
- package/dist/legacy-root-azm/src/lowering/immMath.js +0 -34
- package/dist/legacy-root-azm/src/lowering/inputAssets.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/inputAssets.js +0 -106
- package/dist/legacy-root-azm/src/lowering/ldEncoding.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/ldEncoding.js +0 -12
- package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.js +0 -124
- package/dist/legacy-root-azm/src/lowering/ldFormSelection.d.ts +0 -26
- package/dist/legacy-root-azm/src/lowering/ldFormSelection.js +0 -92
- package/dist/legacy-root-azm/src/lowering/ldLowering.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/ldLowering.js +0 -13
- package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.d.ts +0 -23
- package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.js +0 -185
- package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.js +0 -86
- package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.d.ts +0 -27
- package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.js +0 -215
- package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.d.ts +0 -202
- package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/loweredFormat.d.ts +0 -3
- package/dist/legacy-root-azm/src/lowering/loweredFormat.js +0 -26
- package/dist/legacy-root-azm/src/lowering/loweredItemSize.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/loweredItemSize.js +0 -17
- package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.d.ts +0 -9
- package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.js +0 -55
- package/dist/legacy-root-azm/src/lowering/loweringTypes.d.ts +0 -27
- package/dist/legacy-root-azm/src/lowering/loweringTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.d.ts +0 -9
- package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.js +0 -9
- package/dist/legacy-root-azm/src/lowering/opExpansionExecution.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/opExpansionExecution.js +0 -45
- package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.js +0 -88
- package/dist/legacy-root-azm/src/lowering/opExpansionStream.d.ts +0 -12
- package/dist/legacy-root-azm/src/lowering/opExpansionStream.js +0 -176
- package/dist/legacy-root-azm/src/lowering/opMatching.d.ts +0 -52
- package/dist/legacy-root-azm/src/lowering/opMatching.js +0 -355
- package/dist/legacy-root-azm/src/lowering/opSubstitution.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/opSubstitution.js +0 -175
- package/dist/legacy-root-azm/src/lowering/prescanTypes.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/prescanTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/programLowering.d.ts +0 -144
- package/dist/legacy-root-azm/src/lowering/programLowering.js +0 -2
- package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.js +0 -5
- package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.d.ts +0 -18
- package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.js +0 -115
- package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.d.ts +0 -2
- package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.js +0 -93
- package/dist/legacy-root-azm/src/lowering/programPrescan.d.ts +0 -3
- package/dist/legacy-root-azm/src/lowering/programPrescan.js +0 -37
- package/dist/legacy-root-azm/src/lowering/traceFormat.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/traceFormat.js +0 -211
- package/dist/legacy-root-azm/src/packageInfo.d.ts +0 -1
- package/dist/legacy-root-azm/src/packageInfo.js +0 -15
- package/dist/legacy-root-azm/src/pathCompare.d.ts +0 -3
- package/dist/legacy-root-azm/src/pathCompare.js +0 -26
- package/dist/legacy-root-azm/src/pipeline.d.ts +0 -91
- package/dist/legacy-root-azm/src/pipeline.js +0 -1
- package/dist/legacy-root-azm/src/registerCare/analyze.d.ts +0 -24
- package/dist/legacy-root-azm/src/registerCare/analyze.js +0 -327
- package/dist/legacy-root-azm/src/registerCare/boundaryHints.d.ts +0 -2
- package/dist/legacy-root-azm/src/registerCare/boundaryHints.js +0 -10
- package/dist/legacy-root-azm/src/registerCare/carriers.d.ts +0 -4
- package/dist/legacy-root-azm/src/registerCare/carriers.js +0 -78
- package/dist/legacy-root-azm/src/registerCare/controlFlow.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/controlFlow.js +0 -35
- package/dist/legacy-root-azm/src/registerCare/fix.d.ts +0 -11
- package/dist/legacy-root-azm/src/registerCare/fix.js +0 -119
- package/dist/legacy-root-azm/src/registerCare/liveness.d.ts +0 -7
- package/dist/legacy-root-azm/src/registerCare/liveness.js +0 -227
- package/dist/legacy-root-azm/src/registerCare/profiles.d.ts +0 -11
- package/dist/legacy-root-azm/src/registerCare/profiles.js +0 -45
- package/dist/legacy-root-azm/src/registerCare/programModel.d.ts +0 -3
- package/dist/legacy-root-azm/src/registerCare/programModel.js +0 -181
- package/dist/legacy-root-azm/src/registerCare/report.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/report.js +0 -139
- package/dist/legacy-root-azm/src/registerCare/smartComments.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/smartComments.js +0 -247
- package/dist/legacy-root-azm/src/registerCare/types.d.ts +0 -154
- package/dist/legacy-root-azm/src/registerCare/types.js +0 -1
- package/dist/legacy-root-azm/src/semantics/declVisitor.d.ts +0 -5
- package/dist/legacy-root-azm/src/semantics/declVisitor.js +0 -11
- package/dist/legacy-root-azm/src/semantics/env.d.ts +0 -28
- package/dist/legacy-root-azm/src/semantics/env.js +0 -432
- package/dist/legacy-root-azm/src/semantics/layout.d.ts +0 -21
- package/dist/legacy-root-azm/src/semantics/layout.js +0 -226
- package/dist/legacy-root-azm/src/semantics/layoutCastFold.d.ts +0 -22
- package/dist/legacy-root-azm/src/semantics/layoutCastFold.js +0 -118
- package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.d.ts +0 -2
- package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.js +0 -4
- package/dist/legacy-root-azm/src/semantics/typeQueries.d.ts +0 -31
- package/dist/legacy-root-azm/src/semantics/typeQueries.js +0 -124
- package/dist/legacy-root-azm/src/sourceIncludeExpansion.d.ts +0 -17
- package/dist/legacy-root-azm/src/sourceIncludeExpansion.js +0 -124
- package/dist/legacy-root-azm/src/sourceIncludePaths.d.ts +0 -1
- package/dist/legacy-root-azm/src/sourceIncludePaths.js +0 -12
- package/dist/legacy-root-azm/src/sourceLoader.d.ts +0 -15
- package/dist/legacy-root-azm/src/sourceLoader.js +0 -118
- package/dist/legacy-root-azm/src/z80/effects.d.ts +0 -3
- package/dist/legacy-root-azm/src/z80/effects.js +0 -516
- package/dist/legacy-root-azm/src/z80/encode.d.ts +0 -10
- package/dist/legacy-root-azm/src/z80/encode.js +0 -412
- package/dist/legacy-root-azm/src/z80/encodeAlu.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeAlu.js +0 -219
- package/dist/legacy-root-azm/src/z80/encodeBitOps.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeBitOps.js +0 -123
- package/dist/legacy-root-azm/src/z80/encodeContext.d.ts +0 -29
- package/dist/legacy-root-azm/src/z80/encodeContext.js +0 -1
- package/dist/legacy-root-azm/src/z80/encodeControl.d.ts +0 -26
- package/dist/legacy-root-azm/src/z80/encodeControl.js +0 -180
- package/dist/legacy-root-azm/src/z80/encodeCoreOps.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeCoreOps.js +0 -131
- package/dist/legacy-root-azm/src/z80/encodeIo.d.ts +0 -9
- package/dist/legacy-root-azm/src/z80/encodeIo.js +0 -128
- package/dist/legacy-root-azm/src/z80/encodeLd.d.ts +0 -13
- package/dist/legacy-root-azm/src/z80/encodeLd.js +0 -273
- package/dist/legacy-root-azm/src/z80/encoderRegistry.d.ts +0 -13
- package/dist/legacy-root-azm/src/z80/encoderRegistry.js +0 -169
- package/dist/src/outputs/write-listing.d.ts +0 -2
- package/dist/src/outputs/write-listing.js +0 -79
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/annotate.d.ts +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/annotate.js +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/sourceText.d.ts +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/sourceText.js +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/summary.d.ts +0 -0
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
import { span } from './source.js';
|
|
2
|
-
import { parseDiag as diag } from './parseDiagnostics.js';
|
|
3
|
-
import { diagIfArrayLengthMissing, parseNumberLiteral, parseTypeExprFromText } from './parseImm.js';
|
|
4
|
-
import { diagInvalidBlockLine, formatIdentifierToken, topLevelStartKeyword, } from './parseTopLevelCommon.js';
|
|
5
|
-
import { stripLineComment as stripComment } from './parseParserShared.js';
|
|
6
|
-
function parseRecordFieldDecl(kindName, fieldText, line, fieldNamesLower, ctx, declaringTypeName) {
|
|
7
|
-
const { file, diagnostics, sourcePath, isReservedTopLevelName } = ctx;
|
|
8
|
-
const { startOffset, endOffset, lineNo, filePath } = line;
|
|
9
|
-
const match = /^([A-Za-z_][A-Za-z0-9_]*)\s+(\.(?:field|byte|word|addr))(?:\s+(.+))?$/i.exec(fieldText);
|
|
10
|
-
if (!match) {
|
|
11
|
-
diagInvalidBlockLine(diagnostics, filePath, `${kindName} field declaration`, fieldText, '<name> .field <size> or <name> .byte/.word/.addr', lineNo);
|
|
12
|
-
return undefined;
|
|
13
|
-
}
|
|
14
|
-
const fieldName = match[1].trim();
|
|
15
|
-
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(fieldName)) {
|
|
16
|
-
diag(diagnostics, filePath, `Invalid ${kindName} field name ${formatIdentifierToken(fieldName)}: expected <identifier>.`, { line: lineNo, column: 1 });
|
|
17
|
-
return undefined;
|
|
18
|
-
}
|
|
19
|
-
if (isReservedTopLevelName(fieldName)) {
|
|
20
|
-
diag(diagnostics, sourcePath, `Invalid ${kindName} field name "${fieldName}": collides with a top-level keyword.`, { line: lineNo, column: 1 });
|
|
21
|
-
return undefined;
|
|
22
|
-
}
|
|
23
|
-
const fieldNameLower = fieldName.toLowerCase();
|
|
24
|
-
if (fieldNamesLower.has(fieldNameLower)) {
|
|
25
|
-
diag(diagnostics, filePath, `Duplicate ${kindName} field name "${fieldName}".`, {
|
|
26
|
-
line: lineNo,
|
|
27
|
-
column: 1,
|
|
28
|
-
});
|
|
29
|
-
return undefined;
|
|
30
|
-
}
|
|
31
|
-
const fieldSpan = span(file, startOffset, endOffset);
|
|
32
|
-
const typeExpr = match[2].startsWith('.')
|
|
33
|
-
? parseAsmFieldTypeExpr(match[2], match[3]?.trim(), fieldSpan)
|
|
34
|
-
: parseTypeExprFromText(match[2].trim(), fieldSpan);
|
|
35
|
-
if (!typeExpr) {
|
|
36
|
-
const typeText = (match[3] ?? match[2] ?? '').trim();
|
|
37
|
-
if (diagIfArrayLengthMissing(diagnostics, filePath, typeText, {
|
|
38
|
-
line: lineNo,
|
|
39
|
-
column: 1,
|
|
40
|
-
})) {
|
|
41
|
-
return undefined;
|
|
42
|
-
}
|
|
43
|
-
diagInvalidBlockLine(diagnostics, filePath, `${kindName} field declaration`, fieldText, '<name> .field <size> or <name> .byte/.word/.addr', lineNo);
|
|
44
|
-
return undefined;
|
|
45
|
-
}
|
|
46
|
-
if (declaringTypeName !== undefined &&
|
|
47
|
-
typeExpr.kind === 'TypeName' &&
|
|
48
|
-
typeExpr.name.toLowerCase() === declaringTypeName.toLowerCase()) {
|
|
49
|
-
diag(diagnostics, filePath, `Self-referential field type "${typeExpr.name}" has no finite size; use .addr for a pointer field.`, { line: lineNo, column: 1 });
|
|
50
|
-
return undefined;
|
|
51
|
-
}
|
|
52
|
-
fieldNamesLower.add(fieldNameLower);
|
|
53
|
-
return {
|
|
54
|
-
kind: 'RecordField',
|
|
55
|
-
span: fieldSpan,
|
|
56
|
-
name: fieldName,
|
|
57
|
-
typeExpr,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function scalarType(span, name) {
|
|
61
|
-
return { kind: 'TypeName', span, name };
|
|
62
|
-
}
|
|
63
|
-
function parseAsmFieldTypeExpr(directive, operandText, fieldSpan) {
|
|
64
|
-
switch (directive.toLowerCase()) {
|
|
65
|
-
case '.byte':
|
|
66
|
-
return operandText === undefined || operandText.length === 0
|
|
67
|
-
? scalarType(fieldSpan, 'byte')
|
|
68
|
-
: undefined;
|
|
69
|
-
case '.word':
|
|
70
|
-
return operandText === undefined || operandText.length === 0
|
|
71
|
-
? scalarType(fieldSpan, 'word')
|
|
72
|
-
: undefined;
|
|
73
|
-
case '.addr':
|
|
74
|
-
return operandText === undefined || operandText.length === 0
|
|
75
|
-
? scalarType(fieldSpan, 'addr')
|
|
76
|
-
: undefined;
|
|
77
|
-
case '.field': {
|
|
78
|
-
if (operandText === undefined || operandText.length === 0)
|
|
79
|
-
return undefined;
|
|
80
|
-
const size = parseNumberLiteral(operandText);
|
|
81
|
-
if (size === undefined) {
|
|
82
|
-
return parseTypeExprFromText(operandText, fieldSpan);
|
|
83
|
-
}
|
|
84
|
-
if (size < 1)
|
|
85
|
-
return undefined;
|
|
86
|
-
if (size === 1)
|
|
87
|
-
return scalarType(fieldSpan, 'byte');
|
|
88
|
-
if (size === 2)
|
|
89
|
-
return scalarType(fieldSpan, 'word');
|
|
90
|
-
return {
|
|
91
|
-
kind: 'ArrayType',
|
|
92
|
-
span: fieldSpan,
|
|
93
|
-
element: scalarType(fieldSpan, 'byte'),
|
|
94
|
-
length: size,
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
default:
|
|
98
|
-
return undefined;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
function parseRecordFields(fieldKind, startIndex, ctx, declarationName, endKeyword) {
|
|
102
|
-
const { file, lineCount, diagnostics, sourcePath, getRawLine, isReservedTopLevelName } = ctx;
|
|
103
|
-
const fields = [];
|
|
104
|
-
const fieldNamesLower = new Set();
|
|
105
|
-
let terminated = false;
|
|
106
|
-
let interruptedByKeyword;
|
|
107
|
-
let interruptedByLine;
|
|
108
|
-
let interruptedByFilePath;
|
|
109
|
-
let endOffset = file.text.length;
|
|
110
|
-
let index = startIndex;
|
|
111
|
-
while (index < lineCount) {
|
|
112
|
-
const fieldLine = getRawLine(index);
|
|
113
|
-
const { endOffset: lineEndOffset, lineNo, filePath } = fieldLine;
|
|
114
|
-
const fieldText = stripComment(fieldLine.raw).trim();
|
|
115
|
-
const fieldTextLower = fieldText.toLowerCase();
|
|
116
|
-
if (fieldText.length === 0) {
|
|
117
|
-
index++;
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
if (fieldTextLower === endKeyword) {
|
|
121
|
-
terminated = true;
|
|
122
|
-
endOffset = lineEndOffset;
|
|
123
|
-
index++;
|
|
124
|
-
break;
|
|
125
|
-
}
|
|
126
|
-
const topKeyword = topLevelStartKeyword(fieldText);
|
|
127
|
-
if (topKeyword !== undefined) {
|
|
128
|
-
interruptedByKeyword = topKeyword;
|
|
129
|
-
interruptedByLine = lineNo;
|
|
130
|
-
interruptedByFilePath = filePath;
|
|
131
|
-
break;
|
|
132
|
-
}
|
|
133
|
-
const field = parseRecordFieldDecl(fieldKind, fieldText, fieldLine, fieldNamesLower, {
|
|
134
|
-
file,
|
|
135
|
-
diagnostics,
|
|
136
|
-
sourcePath,
|
|
137
|
-
isReservedTopLevelName,
|
|
138
|
-
}, declarationName);
|
|
139
|
-
if (field)
|
|
140
|
-
fields.push(field);
|
|
141
|
-
index++;
|
|
142
|
-
}
|
|
143
|
-
return {
|
|
144
|
-
fields,
|
|
145
|
-
nextIndex: index,
|
|
146
|
-
terminated,
|
|
147
|
-
endOffset,
|
|
148
|
-
...(interruptedByKeyword !== undefined ? { interruptedByKeyword } : {}),
|
|
149
|
-
...(interruptedByLine !== undefined ? { interruptedByLine } : {}),
|
|
150
|
-
...(interruptedByFilePath !== undefined ? { interruptedByFilePath } : {}),
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
export function parseRecordFieldBlock(params) {
|
|
154
|
-
const { declarationKind, declarationName, fieldKind, declarationLineNo, startIndex, ctx } = params;
|
|
155
|
-
const { file, diagnostics, sourcePath } = ctx;
|
|
156
|
-
const endKeyword = declarationKind === 'type' ? '.endtype' : '.endunion';
|
|
157
|
-
const parsed = parseRecordFields(fieldKind, startIndex, ctx, declarationName, endKeyword);
|
|
158
|
-
if (!parsed.terminated) {
|
|
159
|
-
if (parsed.interruptedByKeyword !== undefined &&
|
|
160
|
-
parsed.interruptedByLine !== undefined &&
|
|
161
|
-
parsed.interruptedByFilePath !== undefined) {
|
|
162
|
-
diag(diagnostics, parsed.interruptedByFilePath, `Unterminated ${declarationKind} "${declarationName}": expected "${endKeyword}" before "${parsed.interruptedByKeyword}"`, { line: parsed.interruptedByLine, column: 1 });
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
diag(diagnostics, sourcePath, `Unterminated ${declarationKind} "${declarationName}": missing "${endKeyword}"`, { line: declarationLineNo, column: 1 });
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
if (parsed.fields.length === 0) {
|
|
169
|
-
const declarationLabel = declarationKind === 'type' ? 'Type' : 'Union';
|
|
170
|
-
diag(diagnostics, sourcePath, `${declarationLabel} "${declarationName}" must contain at least one field`, { line: declarationLineNo, column: 1 });
|
|
171
|
-
}
|
|
172
|
-
return {
|
|
173
|
-
fields: parsed.fields,
|
|
174
|
-
nextIndex: parsed.nextIndex,
|
|
175
|
-
endOffset: parsed.terminated ? parsed.endOffset : file.text.length,
|
|
176
|
-
};
|
|
177
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
2
|
-
import type { SourceItemNode, SourceSpan } from './ast.js';
|
|
3
|
-
import type { DirectiveAliasPolicy } from './directiveAliases.js';
|
|
4
|
-
import type { LogicalLine } from './parseLogicalLines.js';
|
|
5
|
-
import type { SourceFile } from './source.js';
|
|
6
|
-
export type ParseItemContext = {
|
|
7
|
-
scope: 'source';
|
|
8
|
-
asmEnded?: boolean;
|
|
9
|
-
};
|
|
10
|
-
export type ParseItemResult = {
|
|
11
|
-
nextIndex: number;
|
|
12
|
-
node?: SourceItemNode;
|
|
13
|
-
nodes?: SourceItemNode[];
|
|
14
|
-
};
|
|
15
|
-
export type RawSourceLine = {
|
|
16
|
-
raw: string;
|
|
17
|
-
startOffset: number;
|
|
18
|
-
endOffset: number;
|
|
19
|
-
lineNo: number;
|
|
20
|
-
filePath: string;
|
|
21
|
-
};
|
|
22
|
-
export type ParseSourceItemDispatchArgs = {
|
|
23
|
-
index: number;
|
|
24
|
-
lineNo: number;
|
|
25
|
-
filePath: string;
|
|
26
|
-
text: string;
|
|
27
|
-
rest: string;
|
|
28
|
-
stmtSpan: SourceSpan;
|
|
29
|
-
lineStartOffset: number;
|
|
30
|
-
ctx: ParseItemContext;
|
|
31
|
-
};
|
|
32
|
-
type ParseSourceItemDispatchHandler = (args: ParseSourceItemDispatchArgs) => ParseItemResult | undefined;
|
|
33
|
-
export type SourceItemDispatchTable = Readonly<Partial<Record<string, ParseSourceItemDispatchHandler>>>;
|
|
34
|
-
type DispatchSourceItemContext = {
|
|
35
|
-
aliasPolicy?: DirectiveAliasPolicy;
|
|
36
|
-
diagnostics: Diagnostic[];
|
|
37
|
-
file: SourceFile;
|
|
38
|
-
getRawLine: (lineIndex: number) => RawSourceLine;
|
|
39
|
-
logicalLines: LogicalLine[];
|
|
40
|
-
sourceItemDispatchTable: SourceItemDispatchTable;
|
|
41
|
-
sourcePath: string;
|
|
42
|
-
asmStringEquates: Map<string, string>;
|
|
43
|
-
span: typeof import('./source.js').span;
|
|
44
|
-
};
|
|
45
|
-
export declare function dispatchSourceItem(index: number, ctx: ParseItemContext, dispatchContext: DispatchSourceItemContext): ParseItemResult;
|
|
46
|
-
export {};
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { parseAsmTopLevel } from './parseAsmTopLevel.js';
|
|
2
|
-
import { topLevelStartKeyword } from './parseTopLevelCommon.js';
|
|
3
|
-
import { recoverUnsupportedParserLine } from './parseParserRecovery.js';
|
|
4
|
-
import { stripLineComment as stripComment } from './parseParserShared.js';
|
|
5
|
-
export function dispatchSourceItem(index, ctx, dispatchContext) {
|
|
6
|
-
const { aliasPolicy, diagnostics, file, getRawLine, logicalLines, sourceItemDispatchTable, sourcePath, asmStringEquates, span, } = dispatchContext;
|
|
7
|
-
const { raw, startOffset: lineStartOffset, endOffset: lineEndOffset } = getRawLine(index);
|
|
8
|
-
const text = stripComment(raw).trim();
|
|
9
|
-
const lineNo = logicalLines[index]?.lineNo ?? index + 1;
|
|
10
|
-
const filePath = logicalLines[index]?.filePath ?? sourcePath;
|
|
11
|
-
if (text.length === 0)
|
|
12
|
-
return { nextIndex: index + 1 };
|
|
13
|
-
const rest = text;
|
|
14
|
-
const stmtSpan = span(file, lineStartOffset, lineEndOffset);
|
|
15
|
-
const parsedAsm = parseAsmTopLevel({
|
|
16
|
-
index,
|
|
17
|
-
filePath,
|
|
18
|
-
lineNo,
|
|
19
|
-
rest,
|
|
20
|
-
stmtSpan,
|
|
21
|
-
diagnostics,
|
|
22
|
-
ctx,
|
|
23
|
-
...(aliasPolicy ? { aliasPolicy } : {}),
|
|
24
|
-
asmStringEquates,
|
|
25
|
-
});
|
|
26
|
-
if (parsedAsm)
|
|
27
|
-
return parsedAsm;
|
|
28
|
-
const dispatchKeyword = topLevelStartKeyword(rest);
|
|
29
|
-
const dispatchHandler = dispatchKeyword === undefined ? undefined : sourceItemDispatchTable[dispatchKeyword];
|
|
30
|
-
if (dispatchHandler) {
|
|
31
|
-
const parsed = dispatchHandler({
|
|
32
|
-
index,
|
|
33
|
-
lineNo,
|
|
34
|
-
filePath,
|
|
35
|
-
text,
|
|
36
|
-
rest,
|
|
37
|
-
stmtSpan,
|
|
38
|
-
lineStartOffset,
|
|
39
|
-
ctx,
|
|
40
|
-
});
|
|
41
|
-
if (parsed)
|
|
42
|
-
return parsed;
|
|
43
|
-
}
|
|
44
|
-
return recoverUnsupportedParserLine({
|
|
45
|
-
index,
|
|
46
|
-
scope: ctx.scope,
|
|
47
|
-
text,
|
|
48
|
-
rest,
|
|
49
|
-
lineNo,
|
|
50
|
-
filePath,
|
|
51
|
-
diagnostics,
|
|
52
|
-
});
|
|
53
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
2
|
-
import type { LogicalLine } from './parseLogicalLines.js';
|
|
3
|
-
import type { SourceFile } from './source.js';
|
|
4
|
-
import type { SourceItemDispatchTable, RawSourceLine } from './parseSourceItemDispatch.js';
|
|
5
|
-
type CreateSourceItemTableContext = {
|
|
6
|
-
diagnostics: Diagnostic[];
|
|
7
|
-
file: SourceFile;
|
|
8
|
-
getRawLine: (lineIndex: number) => RawSourceLine;
|
|
9
|
-
isReservedTopLevelName: (name: string) => boolean;
|
|
10
|
-
lineCount: number;
|
|
11
|
-
logicalLines: LogicalLine[];
|
|
12
|
-
sourcePath: string;
|
|
13
|
-
parseOpParamsFromText: typeof import('./parseParams.js').parseOpParamsFromText;
|
|
14
|
-
};
|
|
15
|
-
export declare function createSourceItemTable(ctx: CreateSourceItemTableContext): SourceItemDispatchTable;
|
|
16
|
-
export {};
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { consumeTopKeyword } from './parseTopLevelCommon.js';
|
|
2
|
-
import { parseEnumDecl } from './parseEnum.js';
|
|
3
|
-
import { parseTopLevelOpDecl } from './parseOp.js';
|
|
4
|
-
import { parseTypeDecl, parseUnionDecl } from './parseTypes.js';
|
|
5
|
-
export function createSourceItemTable(ctx) {
|
|
6
|
-
const { diagnostics, file, getRawLine, isReservedTopLevelName, lineCount, logicalLines: _logicalLines, parseOpParamsFromText, } = ctx;
|
|
7
|
-
function parseTypeItem({ index, lineNo, filePath, text, rest, stmtSpan, }) {
|
|
8
|
-
const typeTail = consumeTopKeyword(rest, 'type') ?? '';
|
|
9
|
-
const parsedType = parseTypeDecl(typeTail, text, stmtSpan, lineNo, index, {
|
|
10
|
-
file,
|
|
11
|
-
lineCount,
|
|
12
|
-
diagnostics,
|
|
13
|
-
sourcePath: filePath,
|
|
14
|
-
getRawLine,
|
|
15
|
-
isReservedTopLevelName,
|
|
16
|
-
});
|
|
17
|
-
if (!parsedType)
|
|
18
|
-
return { nextIndex: index + 1 };
|
|
19
|
-
return { nextIndex: parsedType.nextIndex, node: parsedType.node };
|
|
20
|
-
}
|
|
21
|
-
function parseUnionItem({ index, lineNo, filePath, text, rest, stmtSpan, }) {
|
|
22
|
-
const unionTail = consumeTopKeyword(rest, 'union') ?? '';
|
|
23
|
-
const parsedUnion = parseUnionDecl(unionTail, text, stmtSpan, lineNo, index, {
|
|
24
|
-
file,
|
|
25
|
-
lineCount,
|
|
26
|
-
diagnostics,
|
|
27
|
-
sourcePath: filePath,
|
|
28
|
-
getRawLine,
|
|
29
|
-
isReservedTopLevelName,
|
|
30
|
-
});
|
|
31
|
-
if (!parsedUnion)
|
|
32
|
-
return { nextIndex: index + 1 };
|
|
33
|
-
return { nextIndex: parsedUnion.nextIndex, node: parsedUnion.node };
|
|
34
|
-
}
|
|
35
|
-
function parseOpItem({ index, lineNo, filePath, text, rest, stmtSpan, }) {
|
|
36
|
-
const opTail = consumeTopKeyword(rest, 'op') ?? '';
|
|
37
|
-
const parsedOp = parseTopLevelOpDecl(opTail, text, stmtSpan, lineNo, index, {
|
|
38
|
-
file,
|
|
39
|
-
lineCount,
|
|
40
|
-
diagnostics,
|
|
41
|
-
sourcePath: filePath,
|
|
42
|
-
getRawLine,
|
|
43
|
-
isReservedTopLevelName,
|
|
44
|
-
parseOpParamsFromText,
|
|
45
|
-
});
|
|
46
|
-
if (!parsedOp)
|
|
47
|
-
return { nextIndex: index + 1 };
|
|
48
|
-
return { nextIndex: parsedOp.nextIndex, node: parsedOp.node };
|
|
49
|
-
}
|
|
50
|
-
function parseEnumItem({ index, lineNo, filePath, text, rest, stmtSpan, }) {
|
|
51
|
-
const enumTail = consumeTopKeyword(rest, 'enum') ?? '';
|
|
52
|
-
const enumNode = parseEnumDecl(enumTail, {
|
|
53
|
-
diagnostics,
|
|
54
|
-
sourcePath: filePath,
|
|
55
|
-
lineNo,
|
|
56
|
-
text,
|
|
57
|
-
span: stmtSpan,
|
|
58
|
-
isReservedTopLevelName,
|
|
59
|
-
});
|
|
60
|
-
return { nextIndex: index + 1, ...(enumNode ? { node: enumNode } : {}) };
|
|
61
|
-
}
|
|
62
|
-
return {
|
|
63
|
-
type: parseTypeItem,
|
|
64
|
-
union: parseUnionItem,
|
|
65
|
-
op: parseOpItem,
|
|
66
|
-
enum: parseEnumItem,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
2
|
-
export declare const malformedTopLevelHeaderExpectations: ReadonlyArray<{
|
|
3
|
-
keyword: string;
|
|
4
|
-
kind: string;
|
|
5
|
-
expected: string;
|
|
6
|
-
}>;
|
|
7
|
-
export declare function topLevelStartKeyword(t: string): string | undefined;
|
|
8
|
-
export declare function consumeTopKeyword(input: string, keyword: string): string | undefined;
|
|
9
|
-
export declare function diagInvalidBlockLine(diagnostics: Diagnostic[], sourcePath: string, kind: string, lineText: string, expected: string, line: number): void;
|
|
10
|
-
export declare function diagInvalidHeaderLine(diagnostics: Diagnostic[], sourcePath: string, kind: string, lineText: string, expected: string, line: number): void;
|
|
11
|
-
export declare function formatIdentifierToken(rawText: string): string;
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { parseDiag as diag } from './parseDiagnostics.js';
|
|
2
|
-
import { TOP_LEVEL_KEYWORDS } from './grammarData.js';
|
|
3
|
-
export const malformedTopLevelHeaderExpectations = [
|
|
4
|
-
{ keyword: 'type', kind: 'type declaration', expected: '<name>' },
|
|
5
|
-
{ keyword: 'union', kind: 'union declaration', expected: '<name>' },
|
|
6
|
-
{ keyword: 'op', kind: 'op header', expected: '<name>(...)' },
|
|
7
|
-
{ keyword: 'enum', kind: 'enum declaration', expected: '<name> <member>[, ...]' },
|
|
8
|
-
];
|
|
9
|
-
function consumeKeywordPrefix(input, keyword) {
|
|
10
|
-
const match = new RegExp(`^\\.?${keyword}(?:\\s+(.*))?$`, 'i').exec(input);
|
|
11
|
-
if (!match)
|
|
12
|
-
return undefined;
|
|
13
|
-
return (match[1] ?? '').trimStart();
|
|
14
|
-
}
|
|
15
|
-
export function topLevelStartKeyword(t) {
|
|
16
|
-
const rawKeyword = (t.split(/\s/, 1)[0] ?? '').toLowerCase();
|
|
17
|
-
if (!rawKeyword.startsWith('.') && (rawKeyword === 'type' || rawKeyword === 'union')) {
|
|
18
|
-
return undefined;
|
|
19
|
-
}
|
|
20
|
-
const keyword = rawKeyword.startsWith('.') ? rawKeyword.slice(1) : rawKeyword;
|
|
21
|
-
return TOP_LEVEL_KEYWORDS.has(keyword) ? keyword : undefined;
|
|
22
|
-
}
|
|
23
|
-
export function consumeTopKeyword(input, keyword) {
|
|
24
|
-
return consumeKeywordPrefix(input, keyword);
|
|
25
|
-
}
|
|
26
|
-
function quoteDiagLineText(text) {
|
|
27
|
-
const trimmed = text.trim();
|
|
28
|
-
const preview = trimmed.length > 96 ? `${trimmed.slice(0, 93)}...` : trimmed;
|
|
29
|
-
return preview.replace(/"/g, '\\"');
|
|
30
|
-
}
|
|
31
|
-
export function diagInvalidBlockLine(diagnostics, sourcePath, kind, lineText, expected, line) {
|
|
32
|
-
const q = quoteDiagLineText(lineText);
|
|
33
|
-
diag(diagnostics, sourcePath, `Invalid ${kind} line "${q}": expected ${expected}`, {
|
|
34
|
-
line,
|
|
35
|
-
column: 1,
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
export function diagInvalidHeaderLine(diagnostics, sourcePath, kind, lineText, expected, line) {
|
|
39
|
-
const q = quoteDiagLineText(lineText);
|
|
40
|
-
diag(diagnostics, sourcePath, `Invalid ${kind} line "${q}": expected ${expected}`, {
|
|
41
|
-
line,
|
|
42
|
-
column: 1,
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
export function formatIdentifierToken(rawText) {
|
|
46
|
-
const trimmed = rawText.trim();
|
|
47
|
-
if (trimmed.length === 0)
|
|
48
|
-
return '<empty>';
|
|
49
|
-
return `"${trimmed.replace(/"/g, '\\"')}"`;
|
|
50
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { SourceSpan, TypeDeclNode, UnionDeclNode } from './ast.js';
|
|
2
|
-
import type { SourceFile } from './source.js';
|
|
3
|
-
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
4
|
-
import { type RecordFieldLine } from './parseRecordFieldDecl.js';
|
|
5
|
-
type RawLine = RecordFieldLine;
|
|
6
|
-
type ParseTypeContext = {
|
|
7
|
-
file: SourceFile;
|
|
8
|
-
lineCount: number;
|
|
9
|
-
diagnostics: Diagnostic[];
|
|
10
|
-
sourcePath: string;
|
|
11
|
-
getRawLine: (lineIndex: number) => RawLine;
|
|
12
|
-
isReservedTopLevelName: (name: string) => boolean;
|
|
13
|
-
};
|
|
14
|
-
type ParsedTypeDecl = {
|
|
15
|
-
node: TypeDeclNode;
|
|
16
|
-
nextIndex: number;
|
|
17
|
-
};
|
|
18
|
-
type ParsedUnionDecl = {
|
|
19
|
-
node: UnionDeclNode;
|
|
20
|
-
nextIndex: number;
|
|
21
|
-
};
|
|
22
|
-
export declare function parseTypeDecl(typeTail: string, stmtText: string, stmtSpan: SourceSpan, lineNo: number, startIndex: number, ctx: ParseTypeContext): ParsedTypeDecl | undefined;
|
|
23
|
-
export declare function parseUnionDecl(unionTail: string, stmtText: string, stmtSpan: SourceSpan, lineNo: number, startIndex: number, ctx: ParseTypeContext): ParsedUnionDecl | undefined;
|
|
24
|
-
export {};
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { span } from './source.js';
|
|
2
|
-
import { parseDiag as diag } from './parseDiagnostics.js';
|
|
3
|
-
import { diagInvalidHeaderLine, formatIdentifierToken } from './parseTopLevelCommon.js';
|
|
4
|
-
import { parseRecordFieldBlock } from './parseRecordFieldDecl.js';
|
|
5
|
-
function parseLayoutDeclName(declarationKind, name, stmtText, lineNo, ctx) {
|
|
6
|
-
const { diagnostics, sourcePath, isReservedTopLevelName } = ctx;
|
|
7
|
-
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
|
|
8
|
-
if (name.length > 0) {
|
|
9
|
-
diag(diagnostics, sourcePath, `Invalid ${declarationKind} name ${formatIdentifierToken(name)}: expected <identifier>.`, { line: lineNo, column: 1 });
|
|
10
|
-
}
|
|
11
|
-
else {
|
|
12
|
-
diagInvalidHeaderLine(diagnostics, sourcePath, `${declarationKind} declaration`, stmtText, '<name>', lineNo);
|
|
13
|
-
}
|
|
14
|
-
return undefined;
|
|
15
|
-
}
|
|
16
|
-
if (isReservedTopLevelName(name)) {
|
|
17
|
-
diag(diagnostics, sourcePath, `Invalid ${declarationKind} name "${name}": collides with a top-level keyword.`, { line: lineNo, column: 1 });
|
|
18
|
-
return undefined;
|
|
19
|
-
}
|
|
20
|
-
return name;
|
|
21
|
-
}
|
|
22
|
-
export function parseTypeDecl(typeTail, stmtText, stmtSpan, lineNo, startIndex, ctx) {
|
|
23
|
-
const { file, diagnostics, sourcePath } = ctx;
|
|
24
|
-
const afterType = typeTail.trim();
|
|
25
|
-
const parts = afterType.split(/\s+/, 2);
|
|
26
|
-
const name = parseLayoutDeclName('type', parts[0] ?? '', stmtText, lineNo, ctx);
|
|
27
|
-
if (!name)
|
|
28
|
-
return undefined;
|
|
29
|
-
const tail = afterType.slice(name.length).trimStart();
|
|
30
|
-
if (tail.length > 0) {
|
|
31
|
-
diagInvalidHeaderLine(diagnostics, sourcePath, 'type declaration', stmtText, '<name>', lineNo);
|
|
32
|
-
return undefined;
|
|
33
|
-
}
|
|
34
|
-
const record = parseRecordFieldBlock({
|
|
35
|
-
declarationKind: 'type',
|
|
36
|
-
declarationName: name,
|
|
37
|
-
fieldKind: 'record',
|
|
38
|
-
declarationLineNo: lineNo,
|
|
39
|
-
startIndex: startIndex + 1,
|
|
40
|
-
ctx,
|
|
41
|
-
});
|
|
42
|
-
const typeEnd = record.endOffset;
|
|
43
|
-
const typeSpan = span(file, stmtSpan.start.offset, typeEnd);
|
|
44
|
-
return {
|
|
45
|
-
node: {
|
|
46
|
-
kind: 'TypeDecl',
|
|
47
|
-
span: typeSpan,
|
|
48
|
-
name,
|
|
49
|
-
typeExpr: { kind: 'RecordType', span: typeSpan, fields: record.fields },
|
|
50
|
-
},
|
|
51
|
-
nextIndex: record.nextIndex,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
export function parseUnionDecl(unionTail, stmtText, stmtSpan, lineNo, startIndex, ctx) {
|
|
55
|
-
const { file } = ctx;
|
|
56
|
-
const name = parseLayoutDeclName('union', unionTail.trim(), stmtText, lineNo, ctx);
|
|
57
|
-
if (!name)
|
|
58
|
-
return undefined;
|
|
59
|
-
const record = parseRecordFieldBlock({
|
|
60
|
-
declarationKind: 'union',
|
|
61
|
-
declarationName: name,
|
|
62
|
-
fieldKind: 'union',
|
|
63
|
-
declarationLineNo: lineNo,
|
|
64
|
-
startIndex: startIndex + 1,
|
|
65
|
-
ctx,
|
|
66
|
-
});
|
|
67
|
-
const unionEnd = record.endOffset;
|
|
68
|
-
return {
|
|
69
|
-
node: {
|
|
70
|
-
kind: 'UnionDecl',
|
|
71
|
-
span: span(file, stmtSpan.start.offset, unionEnd),
|
|
72
|
-
name,
|
|
73
|
-
fields: record.fields,
|
|
74
|
-
},
|
|
75
|
-
nextIndex: record.nextIndex,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { SourceFileNode } from './ast.js';
|
|
2
|
-
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
3
|
-
import { type SourceFile } from './source.js';
|
|
4
|
-
import type { DirectiveAliasPolicy } from './directiveAliases.js';
|
|
5
|
-
/**
|
|
6
|
-
* Parse a single AZM source file from an in-memory source string.
|
|
7
|
-
*
|
|
8
|
-
* Implementation note:
|
|
9
|
-
* - Parsing is best-effort: on errors, diagnostics are appended and parsing continues.
|
|
10
|
-
*/
|
|
11
|
-
export declare function parseSourceFile(sourcePath: string, sourceText: string, diagnostics: Diagnostic[], sourceFileOverride?: SourceFile, aliasPolicy?: DirectiveAliasPolicy): SourceFileNode;
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { buildLogicalLines, getLogicalLine } from './parseLogicalLines.js';
|
|
2
|
-
import { dispatchSourceItem, } from './parseSourceItemDispatch.js';
|
|
3
|
-
import { createSourceItemTable } from './parseSourceItemTable.js';
|
|
4
|
-
import { parseOpParamsFromText } from './parseParams.js';
|
|
5
|
-
import { isReservedTopLevelDeclName } from './parseParserShared.js';
|
|
6
|
-
import { makeSourceFile, span } from './source.js';
|
|
7
|
-
import { parseAsmLine } from './asm80/asmLine.js';
|
|
8
|
-
import { parseWholeQuotedString } from './asm80/parseAsmRawValues.js';
|
|
9
|
-
/**
|
|
10
|
-
* Parse a single AZM source file from an in-memory source string.
|
|
11
|
-
*
|
|
12
|
-
* Implementation note:
|
|
13
|
-
* - Parsing is best-effort: on errors, diagnostics are appended and parsing continues.
|
|
14
|
-
*/
|
|
15
|
-
export function parseSourceFile(sourcePath, sourceText, diagnostics, sourceFileOverride, aliasPolicy) {
|
|
16
|
-
const file = sourceFileOverride ?? makeSourceFile(sourcePath, sourceText);
|
|
17
|
-
const logicalLines = buildLogicalLines(file, sourcePath, diagnostics);
|
|
18
|
-
const lineCount = logicalLines.length;
|
|
19
|
-
function getRawLine(lineIndex) {
|
|
20
|
-
const logical = getLogicalLine(logicalLines, lineIndex, sourcePath);
|
|
21
|
-
return {
|
|
22
|
-
raw: logical.raw,
|
|
23
|
-
startOffset: logical.startOffset,
|
|
24
|
-
endOffset: logical.endOffset,
|
|
25
|
-
lineNo: logical.lineNo,
|
|
26
|
-
filePath: logical.filePath,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
const items = [];
|
|
30
|
-
const asmStringEquates = new Map();
|
|
31
|
-
for (let index = 0; index < lineCount; index++) {
|
|
32
|
-
const line = getRawLine(index);
|
|
33
|
-
const parsed = parseAsmLine(line.filePath, line.raw, line.lineNo, line.startOffset, aliasPolicy);
|
|
34
|
-
if (parsed?.kind === 'end')
|
|
35
|
-
break;
|
|
36
|
-
if (parsed?.kind !== 'equ')
|
|
37
|
-
continue;
|
|
38
|
-
const rawString = parseWholeQuotedString(parsed.exprText);
|
|
39
|
-
if (rawString !== undefined && rawString.length > 1) {
|
|
40
|
-
const name = parsed.name.startsWith('@') ? parsed.name.slice(1) : parsed.name;
|
|
41
|
-
asmStringEquates.set(name.toLowerCase(), rawString);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
function isReservedTopLevelName(name) {
|
|
45
|
-
return isReservedTopLevelDeclName(name);
|
|
46
|
-
}
|
|
47
|
-
const sourceItemDispatchTable = createSourceItemTable({
|
|
48
|
-
diagnostics,
|
|
49
|
-
file,
|
|
50
|
-
getRawLine,
|
|
51
|
-
isReservedTopLevelName,
|
|
52
|
-
lineCount,
|
|
53
|
-
logicalLines,
|
|
54
|
-
sourcePath,
|
|
55
|
-
parseOpParamsFromText,
|
|
56
|
-
});
|
|
57
|
-
function parseSourceItem(index, ctx) {
|
|
58
|
-
return dispatchSourceItem(index, ctx, {
|
|
59
|
-
diagnostics,
|
|
60
|
-
file,
|
|
61
|
-
getRawLine,
|
|
62
|
-
logicalLines,
|
|
63
|
-
sourceItemDispatchTable,
|
|
64
|
-
sourcePath,
|
|
65
|
-
asmStringEquates,
|
|
66
|
-
...(aliasPolicy ? { aliasPolicy } : {}),
|
|
67
|
-
span,
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
const sourceCtx = { scope: 'source' };
|
|
71
|
-
let i = 0;
|
|
72
|
-
while (i < lineCount) {
|
|
73
|
-
const parsed = parseSourceItem(i, sourceCtx);
|
|
74
|
-
if (parsed.nodes)
|
|
75
|
-
items.push(...parsed.nodes);
|
|
76
|
-
else if (parsed.node)
|
|
77
|
-
items.push(parsed.node);
|
|
78
|
-
i = parsed.nextIndex;
|
|
79
|
-
}
|
|
80
|
-
const sourceSpan = span(file, 0, sourceText.length);
|
|
81
|
-
const sourceFileNode = {
|
|
82
|
-
kind: 'SourceFile',
|
|
83
|
-
span: sourceSpan,
|
|
84
|
-
path: sourcePath,
|
|
85
|
-
items,
|
|
86
|
-
};
|
|
87
|
-
return sourceFileNode;
|
|
88
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { SourceSpan } from './ast.js';
|
|
2
|
-
/**
|
|
3
|
-
* Source file + precomputed line-start offsets, used to convert byte offsets into line/column spans.
|
|
4
|
-
*/
|
|
5
|
-
export interface SourceFile {
|
|
6
|
-
path: string;
|
|
7
|
-
text: string;
|
|
8
|
-
/**
|
|
9
|
-
* 0-based byte offsets for the start of each line. The first entry is always 0.
|
|
10
|
-
*/
|
|
11
|
-
lineStarts: number[];
|
|
12
|
-
/**
|
|
13
|
-
* Optional per-line file mapping for include-aware source locations.
|
|
14
|
-
*/
|
|
15
|
-
lineFiles?: string[];
|
|
16
|
-
/**
|
|
17
|
-
* Optional per-line line number mapping for include-aware source locations.
|
|
18
|
-
*/
|
|
19
|
-
lineBaseLines?: number[];
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Build a {@link SourceFile} from a path and UTF-8 source text.
|
|
23
|
-
*/
|
|
24
|
-
export declare function makeSourceFile(path: string, text: string): SourceFile;
|
|
25
|
-
/**
|
|
26
|
-
* Construct a {@link SourceSpan} for a half-open offset range `[startOffset, endOffset]`.
|
|
27
|
-
*/
|
|
28
|
-
export declare function span(file: SourceFile, startOffset: number, endOffset: number): SourceSpan;
|