@jhlagado/azm 0.2.1 → 0.2.3
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 +16 -9
- package/dist/src/api-compile.d.ts +0 -2
- package/dist/src/api-compile.js +1 -8
- package/dist/src/assembly/address-planning.js +19 -1
- 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 +176 -9
- package/dist/src/expansion/op-expansion.js +1 -0
- package/dist/src/model/expression.d.ts +4 -0
- package/dist/src/model/source-item.d.ts +5 -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 +84 -0
- package/dist/src/semantics/expression-evaluation.d.ts +7 -3
- package/dist/src/semantics/expression-evaluation.js +57 -0
- package/dist/src/syntax/directive-aliases.js +9 -10
- package/dist/src/syntax/parse-expression.js +34 -9
- package/dist/src/syntax/parse-line.js +80 -44
- package/dist/src/tooling/case-style.js +3 -0
- package/docs/reference/cli.md +6 -4
- package/docs/reference/tooling-api.md +1 -4
- package/package.json +2 -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/annotate.d.ts +0 -11
- package/dist/legacy-root-azm/src/registerCare/annotate.js +0 -76
- 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/sourceText.d.ts +0 -8
- package/dist/legacy-root-azm/src/registerCare/sourceText.js +0 -15
- package/dist/legacy-root-azm/src/registerCare/summary.d.ts +0 -3
- package/dist/legacy-root-azm/src/registerCare/summary.js +0 -492
- 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
|
@@ -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;
|