@jhlagado/azm 0.1.0
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/LICENSE +649 -0
- package/README.md +142 -0
- package/dist/src/analysis.d.ts +11 -0
- package/dist/src/analysis.js +41 -0
- package/dist/src/api-compile.d.ts +8 -0
- package/dist/src/api-compile.js +3 -0
- package/dist/src/api-tooling.d.ts +25 -0
- package/dist/src/api-tooling.js +21 -0
- package/dist/src/cli.d.ts +30 -0
- package/dist/src/cli.js +523 -0
- package/dist/src/compile.d.ts +10 -0
- package/dist/src/compile.js +175 -0
- package/dist/src/compileShared.d.ts +3 -0
- package/dist/src/compileShared.js +7 -0
- package/dist/src/diagnosticTypes.d.ts +77 -0
- package/dist/src/diagnosticTypes.js +53 -0
- package/dist/src/formats/index.d.ts +7 -0
- package/dist/src/formats/index.js +17 -0
- package/dist/src/formats/range.d.ts +17 -0
- package/dist/src/formats/range.js +45 -0
- package/dist/src/formats/types.d.ts +208 -0
- package/dist/src/formats/types.js +1 -0
- package/dist/src/formats/writeAsm80.d.ts +6 -0
- package/dist/src/formats/writeAsm80.js +86 -0
- package/dist/src/formats/writeBin.d.ts +7 -0
- package/dist/src/formats/writeBin.js +23 -0
- package/dist/src/formats/writeD8m.d.ts +9 -0
- package/dist/src/formats/writeD8m.js +239 -0
- package/dist/src/formats/writeHex.d.ts +9 -0
- package/dist/src/formats/writeHex.js +39 -0
- package/dist/src/formats/writeListing.d.ts +8 -0
- package/dist/src/formats/writeListing.js +83 -0
- package/dist/src/frontend/asm80/asmLine.d.ts +39 -0
- package/dist/src/frontend/asm80/asmLine.js +89 -0
- package/dist/src/frontend/asm80/parseAsmRawValues.d.ts +4 -0
- package/dist/src/frontend/asm80/parseAsmRawValues.js +94 -0
- package/dist/src/frontend/asm80/quoteScan.d.ts +10 -0
- package/dist/src/frontend/asm80/quoteScan.js +25 -0
- package/dist/src/frontend/ast.d.ts +376 -0
- package/dist/src/frontend/ast.js +1 -0
- package/dist/src/frontend/directiveAliases.d.ts +14 -0
- package/dist/src/frontend/directiveAliases.js +189 -0
- package/dist/src/frontend/grammarData.d.ts +14 -0
- package/dist/src/frontend/grammarData.js +65 -0
- package/dist/src/frontend/immExprUtils.d.ts +2 -0
- package/dist/src/frontend/immExprUtils.js +12 -0
- package/dist/src/frontend/parseAsmFlatDirectiveLine.d.ts +17 -0
- package/dist/src/frontend/parseAsmFlatDirectiveLine.js +187 -0
- package/dist/src/frontend/parseAsmInstruction.d.ts +3 -0
- package/dist/src/frontend/parseAsmInstruction.js +73 -0
- package/dist/src/frontend/parseAsmStatements.d.ts +6 -0
- package/dist/src/frontend/parseAsmStatements.js +16 -0
- package/dist/src/frontend/parseAsmStream.d.ts +10 -0
- package/dist/src/frontend/parseAsmStream.js +33 -0
- package/dist/src/frontend/parseAsmTopLevel.d.ts +18 -0
- package/dist/src/frontend/parseAsmTopLevel.js +34 -0
- package/dist/src/frontend/parseDiagnostics.d.ts +9 -0
- package/dist/src/frontend/parseDiagnostics.js +16 -0
- package/dist/src/frontend/parseEnum.d.ts +12 -0
- package/dist/src/frontend/parseEnum.js +70 -0
- package/dist/src/frontend/parseImm.d.ts +10 -0
- package/dist/src/frontend/parseImm.js +397 -0
- package/dist/src/frontend/parseLogicalLines.d.ts +11 -0
- package/dist/src/frontend/parseLogicalLines.js +94 -0
- package/dist/src/frontend/parseOp.d.ts +25 -0
- package/dist/src/frontend/parseOp.js +120 -0
- package/dist/src/frontend/parseOpHeader.d.ts +20 -0
- package/dist/src/frontend/parseOpHeader.js +32 -0
- package/dist/src/frontend/parseOperands.d.ts +4 -0
- package/dist/src/frontend/parseOperands.js +290 -0
- package/dist/src/frontend/parseParams.d.ts +6 -0
- package/dist/src/frontend/parseParams.js +62 -0
- package/dist/src/frontend/parseParserRecovery.d.ts +12 -0
- package/dist/src/frontend/parseParserRecovery.js +17 -0
- package/dist/src/frontend/parseParserShared.d.ts +2 -0
- package/dist/src/frontend/parseParserShared.js +8 -0
- package/dist/src/frontend/parseRawDataDirectiveStart.d.ts +1 -0
- package/dist/src/frontend/parseRawDataDirectiveStart.js +3 -0
- package/dist/src/frontend/parseRawDataDirectives.d.ts +7 -0
- package/dist/src/frontend/parseRawDataDirectives.js +142 -0
- package/dist/src/frontend/parseRecordFieldDecl.d.ts +34 -0
- package/dist/src/frontend/parseRecordFieldDecl.js +177 -0
- package/dist/src/frontend/parseSourceItemDispatch.d.ts +46 -0
- package/dist/src/frontend/parseSourceItemDispatch.js +53 -0
- package/dist/src/frontend/parseSourceItemTable.d.ts +16 -0
- package/dist/src/frontend/parseSourceItemTable.js +68 -0
- package/dist/src/frontend/parseTopLevelCommon.d.ts +11 -0
- package/dist/src/frontend/parseTopLevelCommon.js +50 -0
- package/dist/src/frontend/parseTypes.d.ts +24 -0
- package/dist/src/frontend/parseTypes.js +77 -0
- package/dist/src/frontend/parser.d.ts +11 -0
- package/dist/src/frontend/parser.js +88 -0
- package/dist/src/frontend/source.d.ts +28 -0
- package/dist/src/frontend/source.js +58 -0
- package/dist/src/frontend/sourceExtensions.d.ts +2 -0
- package/dist/src/frontend/sourceExtensions.js +6 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +2 -0
- package/dist/src/lintCaseStyle.d.ts +4 -0
- package/dist/src/lintCaseStyle.js +129 -0
- package/dist/src/lowering/asmDirectiveLowering.d.ts +4 -0
- package/dist/src/lowering/asmDirectiveLowering.js +229 -0
- package/dist/src/lowering/asmDirectiveTraversal.d.ts +47 -0
- package/dist/src/lowering/asmDirectiveTraversal.js +52 -0
- package/dist/src/lowering/asmEquResolution.d.ts +8 -0
- package/dist/src/lowering/asmEquResolution.js +69 -0
- package/dist/src/lowering/asmInstructionLdHelpers.d.ts +15 -0
- package/dist/src/lowering/asmInstructionLdHelpers.js +102 -0
- package/dist/src/lowering/asmInstructionLowering.d.ts +5 -0
- package/dist/src/lowering/asmInstructionLowering.js +54 -0
- package/dist/src/lowering/asmInstructionStream.d.ts +46 -0
- package/dist/src/lowering/asmInstructionStream.js +51 -0
- package/dist/src/lowering/asmLoweringBranchCall.d.ts +43 -0
- package/dist/src/lowering/asmLoweringBranchCall.js +254 -0
- package/dist/src/lowering/asmLoweringHost.d.ts +23 -0
- package/dist/src/lowering/asmLoweringHost.js +1 -0
- package/dist/src/lowering/asmLoweringLd.d.ts +28 -0
- package/dist/src/lowering/asmLoweringLd.js +144 -0
- package/dist/src/lowering/asmRangeLowering.d.ts +17 -0
- package/dist/src/lowering/asmRangeLowering.js +39 -0
- package/dist/src/lowering/asmRawDataLowering.d.ts +16 -0
- package/dist/src/lowering/asmRawDataLowering.js +209 -0
- package/dist/src/lowering/asmSourceEmitter.d.ts +4 -0
- package/dist/src/lowering/asmSourceEmitter.js +9 -0
- package/dist/src/lowering/asmSourceInstructionLowering.d.ts +4 -0
- package/dist/src/lowering/asmSourceInstructionLowering.js +14 -0
- package/dist/src/lowering/asmUtils.d.ts +13 -0
- package/dist/src/lowering/asmUtils.js +105 -0
- package/dist/src/lowering/assemblerFlowSetup.d.ts +54 -0
- package/dist/src/lowering/assemblerFlowSetup.js +128 -0
- package/dist/src/lowering/assemblerLoweringContext.d.ts +151 -0
- package/dist/src/lowering/assemblerLoweringContext.js +16 -0
- package/dist/src/lowering/assemblerLoweringContextSplit.d.ts +7 -0
- package/dist/src/lowering/assemblerLoweringContextSplit.js +75 -0
- package/dist/src/lowering/assemblerLoweringPhases.d.ts +66 -0
- package/dist/src/lowering/assemblerLoweringPhases.js +166 -0
- package/dist/src/lowering/bytePlacement.d.ts +7 -0
- package/dist/src/lowering/bytePlacement.js +37 -0
- package/dist/src/lowering/capabilities.d.ts +67 -0
- package/dist/src/lowering/capabilities.js +1 -0
- package/dist/src/lowering/eaResolution.d.ts +58 -0
- package/dist/src/lowering/eaResolution.js +159 -0
- package/dist/src/lowering/emissionCore.d.ts +17 -0
- package/dist/src/lowering/emissionCore.js +21 -0
- package/dist/src/lowering/emit.d.ts +17 -0
- package/dist/src/lowering/emit.js +46 -0
- package/dist/src/lowering/emitContextBuilder.d.ts +63 -0
- package/dist/src/lowering/emitContextBuilder.js +41 -0
- package/dist/src/lowering/emitFinalization.d.ts +61 -0
- package/dist/src/lowering/emitFinalization.js +66 -0
- package/dist/src/lowering/emitFinalizationSetup.d.ts +19 -0
- package/dist/src/lowering/emitFinalizationSetup.js +26 -0
- package/dist/src/lowering/emitPhase1BuildProgramLoweringContext.d.ts +7 -0
- package/dist/src/lowering/emitPhase1BuildProgramLoweringContext.js +119 -0
- package/dist/src/lowering/emitPhase1Helpers.d.ts +4 -0
- package/dist/src/lowering/emitPhase1Helpers.js +12 -0
- package/dist/src/lowering/emitPhase1Types.d.ts +21 -0
- package/dist/src/lowering/emitPhase1Types.js +1 -0
- package/dist/src/lowering/emitPhase1WirePipeline.d.ts +70 -0
- package/dist/src/lowering/emitPhase1WirePipeline.js +203 -0
- package/dist/src/lowering/emitPhase1Workspace.d.ts +82 -0
- package/dist/src/lowering/emitPhase1Workspace.js +55 -0
- package/dist/src/lowering/emitPipeline.d.ts +121 -0
- package/dist/src/lowering/emitPipeline.js +57 -0
- package/dist/src/lowering/emitProgramContext.d.ts +39 -0
- package/dist/src/lowering/emitProgramContext.js +29 -0
- package/dist/src/lowering/emitState.d.ts +90 -0
- package/dist/src/lowering/emitState.js +124 -0
- package/dist/src/lowering/fixupBaseResolution.d.ts +7 -0
- package/dist/src/lowering/fixupBaseResolution.js +23 -0
- package/dist/src/lowering/fixupEmission.d.ts +64 -0
- package/dist/src/lowering/fixupEmission.js +199 -0
- package/dist/src/lowering/immMath.d.ts +2 -0
- package/dist/src/lowering/immMath.js +34 -0
- package/dist/src/lowering/inputAssets.d.ts +7 -0
- package/dist/src/lowering/inputAssets.js +106 -0
- package/dist/src/lowering/ldEncoding.d.ts +15 -0
- package/dist/src/lowering/ldEncoding.js +12 -0
- package/dist/src/lowering/ldEncodingRegMemHelpers.d.ts +5 -0
- package/dist/src/lowering/ldEncodingRegMemHelpers.js +124 -0
- package/dist/src/lowering/ldFormSelection.d.ts +26 -0
- package/dist/src/lowering/ldFormSelection.js +92 -0
- package/dist/src/lowering/ldLowering.d.ts +7 -0
- package/dist/src/lowering/ldLowering.js +13 -0
- package/dist/src/lowering/loweredAsmByteEmission.d.ts +23 -0
- package/dist/src/lowering/loweredAsmByteEmission.js +185 -0
- package/dist/src/lowering/loweredAsmPlacement.d.ts +13 -0
- package/dist/src/lowering/loweredAsmPlacement.js +86 -0
- package/dist/src/lowering/loweredAsmStreamRecording.d.ts +27 -0
- package/dist/src/lowering/loweredAsmStreamRecording.js +215 -0
- package/dist/src/lowering/loweredAsmTypes.d.ts +202 -0
- package/dist/src/lowering/loweredAsmTypes.js +1 -0
- package/dist/src/lowering/loweredFormat.d.ts +3 -0
- package/dist/src/lowering/loweredFormat.js +26 -0
- package/dist/src/lowering/loweredItemSize.d.ts +4 -0
- package/dist/src/lowering/loweredItemSize.js +17 -0
- package/dist/src/lowering/loweringDiagnostics.d.ts +9 -0
- package/dist/src/lowering/loweringDiagnostics.js +55 -0
- package/dist/src/lowering/loweringTypes.d.ts +27 -0
- package/dist/src/lowering/loweringTypes.js +1 -0
- package/dist/src/lowering/opCandidateRegistry.d.ts +9 -0
- package/dist/src/lowering/opCandidateRegistry.js +9 -0
- package/dist/src/lowering/opExpansionExecution.d.ts +15 -0
- package/dist/src/lowering/opExpansionExecution.js +45 -0
- package/dist/src/lowering/opExpansionOrchestration.d.ts +15 -0
- package/dist/src/lowering/opExpansionOrchestration.js +88 -0
- package/dist/src/lowering/opExpansionStream.d.ts +12 -0
- package/dist/src/lowering/opExpansionStream.js +176 -0
- package/dist/src/lowering/opMatching.d.ts +52 -0
- package/dist/src/lowering/opMatching.js +355 -0
- package/dist/src/lowering/opSubstitution.d.ts +13 -0
- package/dist/src/lowering/opSubstitution.js +175 -0
- package/dist/src/lowering/prescanTypes.d.ts +7 -0
- package/dist/src/lowering/prescanTypes.js +1 -0
- package/dist/src/lowering/programLowering.d.ts +144 -0
- package/dist/src/lowering/programLowering.js +2 -0
- package/dist/src/lowering/programLoweringDeclarations.d.ts +5 -0
- package/dist/src/lowering/programLoweringDeclarations.js +5 -0
- package/dist/src/lowering/programLoweringFinalize.d.ts +18 -0
- package/dist/src/lowering/programLoweringFinalize.js +115 -0
- package/dist/src/lowering/programLoweringTraversal.d.ts +2 -0
- package/dist/src/lowering/programLoweringTraversal.js +93 -0
- package/dist/src/lowering/programPrescan.d.ts +3 -0
- package/dist/src/lowering/programPrescan.js +37 -0
- package/dist/src/lowering/traceFormat.d.ts +13 -0
- package/dist/src/lowering/traceFormat.js +211 -0
- package/dist/src/pathCompare.d.ts +3 -0
- package/dist/src/pathCompare.js +26 -0
- package/dist/src/pipeline.d.ts +78 -0
- package/dist/src/pipeline.js +1 -0
- package/dist/src/registerCare/analyze.d.ts +24 -0
- package/dist/src/registerCare/analyze.js +327 -0
- package/dist/src/registerCare/annotate.d.ts +11 -0
- package/dist/src/registerCare/annotate.js +76 -0
- package/dist/src/registerCare/boundaryHints.d.ts +2 -0
- package/dist/src/registerCare/boundaryHints.js +10 -0
- package/dist/src/registerCare/carriers.d.ts +4 -0
- package/dist/src/registerCare/carriers.js +78 -0
- package/dist/src/registerCare/controlFlow.d.ts +5 -0
- package/dist/src/registerCare/controlFlow.js +35 -0
- package/dist/src/registerCare/fix.d.ts +11 -0
- package/dist/src/registerCare/fix.js +119 -0
- package/dist/src/registerCare/liveness.d.ts +7 -0
- package/dist/src/registerCare/liveness.js +227 -0
- package/dist/src/registerCare/profiles.d.ts +11 -0
- package/dist/src/registerCare/profiles.js +45 -0
- package/dist/src/registerCare/programModel.d.ts +3 -0
- package/dist/src/registerCare/programModel.js +181 -0
- package/dist/src/registerCare/report.d.ts +5 -0
- package/dist/src/registerCare/report.js +139 -0
- package/dist/src/registerCare/smartComments.d.ts +5 -0
- package/dist/src/registerCare/smartComments.js +247 -0
- package/dist/src/registerCare/sourceText.d.ts +8 -0
- package/dist/src/registerCare/sourceText.js +15 -0
- package/dist/src/registerCare/summary.d.ts +3 -0
- package/dist/src/registerCare/summary.js +492 -0
- package/dist/src/registerCare/tooling.d.ts +42 -0
- package/dist/src/registerCare/tooling.js +50 -0
- package/dist/src/registerCare/types.d.ts +154 -0
- package/dist/src/registerCare/types.js +1 -0
- package/dist/src/semantics/declVisitor.d.ts +5 -0
- package/dist/src/semantics/declVisitor.js +11 -0
- package/dist/src/semantics/env.d.ts +28 -0
- package/dist/src/semantics/env.js +432 -0
- package/dist/src/semantics/layout.d.ts +21 -0
- package/dist/src/semantics/layout.js +226 -0
- package/dist/src/semantics/layoutCastFold.d.ts +22 -0
- package/dist/src/semantics/layoutCastFold.js +118 -0
- package/dist/src/semantics/semanticsDiagnostics.d.ts +2 -0
- package/dist/src/semantics/semanticsDiagnostics.js +4 -0
- package/dist/src/semantics/typeQueries.d.ts +31 -0
- package/dist/src/semantics/typeQueries.js +124 -0
- package/dist/src/sourceIncludeExpansion.d.ts +17 -0
- package/dist/src/sourceIncludeExpansion.js +124 -0
- package/dist/src/sourceIncludePaths.d.ts +1 -0
- package/dist/src/sourceIncludePaths.js +12 -0
- package/dist/src/sourceLoader.d.ts +15 -0
- package/dist/src/sourceLoader.js +118 -0
- package/dist/src/z80/effects.d.ts +3 -0
- package/dist/src/z80/effects.js +516 -0
- package/dist/src/z80/encode.d.ts +10 -0
- package/dist/src/z80/encode.js +412 -0
- package/dist/src/z80/encodeAlu.d.ts +7 -0
- package/dist/src/z80/encodeAlu.js +219 -0
- package/dist/src/z80/encodeBitOps.d.ts +7 -0
- package/dist/src/z80/encodeBitOps.js +123 -0
- package/dist/src/z80/encodeContext.d.ts +29 -0
- package/dist/src/z80/encodeContext.js +1 -0
- package/dist/src/z80/encodeControl.d.ts +26 -0
- package/dist/src/z80/encodeControl.js +180 -0
- package/dist/src/z80/encodeCoreOps.d.ts +7 -0
- package/dist/src/z80/encodeCoreOps.js +131 -0
- package/dist/src/z80/encodeIo.d.ts +9 -0
- package/dist/src/z80/encodeIo.js +128 -0
- package/dist/src/z80/encodeLd.d.ts +13 -0
- package/dist/src/z80/encodeLd.js +273 -0
- package/dist/src/z80/encoderRegistry.d.ts +13 -0
- package/dist/src/z80/encoderRegistry.js +169 -0
- package/docs/reference/cli.md +134 -0
- package/docs/reference/tooling-api.md +248 -0
- package/package.json +98 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const TOP_LEVEL_KEYWORDS: Set<string>;
|
|
2
|
+
export declare const ALL_REGISTER_NAMES: Set<string>;
|
|
3
|
+
export declare const INDEX_REG8_NAMES: Set<string>;
|
|
4
|
+
export declare const INDEX_REG16_NAMES: Set<string>;
|
|
5
|
+
export declare const INDEX_MEM_BASE_REGISTERS: Set<string>;
|
|
6
|
+
export declare const IMM_BINARY_OPERATOR_PRECEDENCE: Map<string, number>;
|
|
7
|
+
export declare const IMM_BINARY_OPERATORS: Set<string>;
|
|
8
|
+
export declare const IMM_UNARY_OPERATOR_SET: Set<string>;
|
|
9
|
+
export declare const IMM_MULTI_CHAR_OPERATORS: Set<string>;
|
|
10
|
+
export declare const CHAR_ESCAPE_VALUES: Map<string, number>;
|
|
11
|
+
declare const MATCHER_TYPE_LIST: readonly ["reg8", "reg16", "idx16", "cc", "imm8", "imm16", "ea", "mem8", "mem16"];
|
|
12
|
+
export declare const MATCHER_TYPES: Set<string>;
|
|
13
|
+
export declare const MATCHER_KIND_BY_TYPE: Readonly<Record<(typeof MATCHER_TYPE_LIST)[number], 'MatcherReg8' | 'MatcherReg16' | 'MatcherIdx16' | 'MatcherCc' | 'MatcherImm8' | 'MatcherImm16' | 'MatcherEa' | 'MatcherMem8' | 'MatcherMem16'>>;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const TOP_LEVEL_KEYWORD_LIST = ['enum', 'type', 'union', 'op'];
|
|
2
|
+
export const TOP_LEVEL_KEYWORDS = new Set(TOP_LEVEL_KEYWORD_LIST);
|
|
3
|
+
const REGISTERS_8 = ['A', 'B', 'C', 'D', 'E', 'H', 'L'];
|
|
4
|
+
const REGISTERS_8_EXTENDED = ['IXH', 'IXL', 'IYH', 'IYL', 'I', 'R'];
|
|
5
|
+
const REGISTERS_16_GENERAL = ['HL', 'DE', 'BC', 'SP', 'IX', 'IY'];
|
|
6
|
+
const REGISTERS_16_SPECIAL = ['AF'];
|
|
7
|
+
const REGISTERS_16 = [...REGISTERS_16_GENERAL, ...REGISTERS_16_SPECIAL];
|
|
8
|
+
const REGISTERS_16_SHADOW = ["AF'"];
|
|
9
|
+
const ALL_REGISTER_NAME_LIST = [
|
|
10
|
+
...REGISTERS_8,
|
|
11
|
+
...REGISTERS_8_EXTENDED,
|
|
12
|
+
...REGISTERS_16,
|
|
13
|
+
...REGISTERS_16_SHADOW,
|
|
14
|
+
];
|
|
15
|
+
export const ALL_REGISTER_NAMES = new Set(ALL_REGISTER_NAME_LIST);
|
|
16
|
+
export const INDEX_REG8_NAMES = new Set(REGISTERS_8);
|
|
17
|
+
const INDEX_REG16_LIST = ['HL', 'DE', 'BC'];
|
|
18
|
+
export const INDEX_REG16_NAMES = new Set(INDEX_REG16_LIST);
|
|
19
|
+
const INDEX_MEM_BASE_REGISTER_LIST = ['IX', 'IY'];
|
|
20
|
+
export const INDEX_MEM_BASE_REGISTERS = new Set(INDEX_MEM_BASE_REGISTER_LIST);
|
|
21
|
+
const IMM_OPERATOR_PRECEDENCE = [
|
|
22
|
+
{ level: 7, ops: ['*', '/', '%'] },
|
|
23
|
+
{ level: 6, ops: ['+', '-'] },
|
|
24
|
+
{ level: 5, ops: ['<<', '>>'] },
|
|
25
|
+
{ level: 4, ops: ['&'] },
|
|
26
|
+
{ level: 3, ops: ['^'] },
|
|
27
|
+
{ level: 2, ops: ['|'] },
|
|
28
|
+
];
|
|
29
|
+
export const IMM_BINARY_OPERATOR_PRECEDENCE = new Map(IMM_OPERATOR_PRECEDENCE.flatMap(({ level, ops }) => ops.map((op) => [op, level])));
|
|
30
|
+
export const IMM_BINARY_OPERATORS = new Set(IMM_BINARY_OPERATOR_PRECEDENCE.keys());
|
|
31
|
+
const IMM_UNARY_OPERATORS = ['+', '-', '~'];
|
|
32
|
+
export const IMM_UNARY_OPERATOR_SET = new Set(IMM_UNARY_OPERATORS);
|
|
33
|
+
export const IMM_MULTI_CHAR_OPERATORS = new Set(['<<', '>>']);
|
|
34
|
+
export const CHAR_ESCAPE_VALUES = new Map([
|
|
35
|
+
['n', 10],
|
|
36
|
+
['r', 13],
|
|
37
|
+
['t', 9],
|
|
38
|
+
['0', 0],
|
|
39
|
+
['\\', 92],
|
|
40
|
+
["'", 39],
|
|
41
|
+
['"', 34],
|
|
42
|
+
]);
|
|
43
|
+
const MATCHER_TYPE_LIST = [
|
|
44
|
+
'reg8',
|
|
45
|
+
'reg16',
|
|
46
|
+
'idx16',
|
|
47
|
+
'cc',
|
|
48
|
+
'imm8',
|
|
49
|
+
'imm16',
|
|
50
|
+
'ea',
|
|
51
|
+
'mem8',
|
|
52
|
+
'mem16',
|
|
53
|
+
];
|
|
54
|
+
export const MATCHER_TYPES = new Set(MATCHER_TYPE_LIST);
|
|
55
|
+
export const MATCHER_KIND_BY_TYPE = {
|
|
56
|
+
reg8: 'MatcherReg8',
|
|
57
|
+
reg16: 'MatcherReg16',
|
|
58
|
+
idx16: 'MatcherIdx16',
|
|
59
|
+
cc: 'MatcherCc',
|
|
60
|
+
imm8: 'MatcherImm8',
|
|
61
|
+
imm16: 'MatcherImm16',
|
|
62
|
+
ea: 'MatcherEa',
|
|
63
|
+
mem8: 'MatcherMem8',
|
|
64
|
+
mem16: 'MatcherMem16',
|
|
65
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function containsCurrentLocation(expr) {
|
|
2
|
+
switch (expr.kind) {
|
|
3
|
+
case 'ImmCurrentLocation':
|
|
4
|
+
return true;
|
|
5
|
+
case 'ImmUnary':
|
|
6
|
+
return containsCurrentLocation(expr.expr);
|
|
7
|
+
case 'ImmBinary':
|
|
8
|
+
return containsCurrentLocation(expr.left) || containsCurrentLocation(expr.right);
|
|
9
|
+
default:
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
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 { ParseItemContext } from './parseSourceItemDispatch.js';
|
|
5
|
+
/** Parses one source-file line of ASM flat assembler directives. */
|
|
6
|
+
export declare function parseAsmFlatDirectiveLine(args: {
|
|
7
|
+
rest: string;
|
|
8
|
+
stmtSpan: SourceSpan;
|
|
9
|
+
filePath: string;
|
|
10
|
+
lineNo: number;
|
|
11
|
+
diagnostics: Diagnostic[];
|
|
12
|
+
ctx: Extract<ParseItemContext, {
|
|
13
|
+
scope: 'source';
|
|
14
|
+
}>;
|
|
15
|
+
aliasPolicy?: DirectiveAliasPolicy;
|
|
16
|
+
stringEquates: Map<string, string>;
|
|
17
|
+
}): SourceItemNode[] | undefined;
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { parseAsmLine } from './asm80/asmLine.js';
|
|
2
|
+
import { parseAsmRawValues } from './asm80/parseAsmRawValues.js';
|
|
3
|
+
import { parseImmExprFromText } from './parseImm.js';
|
|
4
|
+
import { parseDiag as diag } from './parseDiagnostics.js';
|
|
5
|
+
import { looksLikeRawDataDirectiveStart } from './parseRawDataDirectiveStart.js';
|
|
6
|
+
import { parseBareRawDataDirective, parseRawDataSizeOperands } from './parseRawDataDirectives.js';
|
|
7
|
+
function isAsmFlatDirectiveLine(rest) {
|
|
8
|
+
const trimmed = rest.trim();
|
|
9
|
+
if (looksLikeRawDataDirectiveStart(trimmed))
|
|
10
|
+
return true;
|
|
11
|
+
if (/^(?:[A-Za-z_][A-Za-z0-9_]*\s*:\s*)?\.?(db|dw|ds)\b/i.test(trimmed))
|
|
12
|
+
return true;
|
|
13
|
+
return /^(?:[A-Za-z_][A-Za-z0-9_]*\s*:\s*)?\.?(org|align|equ|binfrom|binto|end)\b/i.test(trimmed);
|
|
14
|
+
}
|
|
15
|
+
function normalizeRawDataDirectiveText(text) {
|
|
16
|
+
const match = /^\.?(db|dw|ds)\b(.*)$/i.exec(text.trim());
|
|
17
|
+
if (!match)
|
|
18
|
+
return undefined;
|
|
19
|
+
return `${match[1].toLowerCase()}${match[2]}`;
|
|
20
|
+
}
|
|
21
|
+
function isStringEquate(name, stringEquates) {
|
|
22
|
+
const normalized = name.startsWith('@') ? name.slice(1) : name;
|
|
23
|
+
return stringEquates.has(normalized.toLowerCase());
|
|
24
|
+
}
|
|
25
|
+
function directiveColumn(text, directive) {
|
|
26
|
+
const index = text.toLowerCase().indexOf(directive.toLowerCase());
|
|
27
|
+
return index < 0 ? 1 : index + 1;
|
|
28
|
+
}
|
|
29
|
+
function asmRawDataToNode(parsed, stmtSpan, filePath, diagnostics, stringEquates) {
|
|
30
|
+
if (parsed.directive === 'ds') {
|
|
31
|
+
const ds = parseRawDataSizeOperands(parsed.valuesText, stmtSpan.start.line, stmtSpan, filePath, diagnostics);
|
|
32
|
+
return {
|
|
33
|
+
kind: 'AsmRawData',
|
|
34
|
+
span: stmtSpan,
|
|
35
|
+
name: parsed.label,
|
|
36
|
+
directive: 'ds',
|
|
37
|
+
size: ds?.size,
|
|
38
|
+
fill: ds?.fill,
|
|
39
|
+
valuesText: parsed.valuesText,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const values = parseAsmRawValues(filePath, parsed.valuesText, stmtSpan, diagnostics, stringEquates);
|
|
43
|
+
return {
|
|
44
|
+
kind: 'AsmRawData',
|
|
45
|
+
span: stmtSpan,
|
|
46
|
+
name: parsed.label,
|
|
47
|
+
directive: parsed.directive,
|
|
48
|
+
values,
|
|
49
|
+
valuesText: parsed.valuesText,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Parses one source-file line of ASM flat assembler directives. */
|
|
53
|
+
export function parseAsmFlatDirectiveLine(args) {
|
|
54
|
+
const { rest, stmtSpan, filePath, lineNo, diagnostics, ctx, aliasPolicy, stringEquates } = args;
|
|
55
|
+
const trimmed = rest.trim();
|
|
56
|
+
const parsedAsm = parseAsmLine(filePath, trimmed, lineNo, stmtSpan.start.offset, aliasPolicy);
|
|
57
|
+
if (ctx.asmEnded && parsedAsm?.kind !== 'binfrom' && parsedAsm?.kind !== 'binto') {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
if (!isAsmFlatDirectiveLine(trimmed) &&
|
|
61
|
+
parsedAsm?.kind !== 'rawData' &&
|
|
62
|
+
parsedAsm?.kind !== 'equ' &&
|
|
63
|
+
parsedAsm?.kind !== 'org' &&
|
|
64
|
+
parsedAsm?.kind !== 'align' &&
|
|
65
|
+
parsedAsm?.kind !== 'binfrom' &&
|
|
66
|
+
parsedAsm?.kind !== 'binto' &&
|
|
67
|
+
parsedAsm?.kind !== 'end' &&
|
|
68
|
+
parsedAsm?.kind !== 'unsupportedDirective') {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
const inlineLabelRaw = /^([A-Za-z_][A-Za-z0-9_]*)\s*:\s*\.?(db|dw|ds)\b(.*)$/i.exec(trimmed);
|
|
72
|
+
if (inlineLabelRaw) {
|
|
73
|
+
return parsedAsm?.kind === 'rawData'
|
|
74
|
+
? [asmRawDataToNode(parsedAsm, stmtSpan, filePath, diagnostics, stringEquates)]
|
|
75
|
+
: [];
|
|
76
|
+
}
|
|
77
|
+
const inlineLabelEqu = /^([A-Za-z_][A-Za-z0-9_]*)\s*:\s*\.?equ\b\s*(.+)$/i.exec(trimmed);
|
|
78
|
+
if (inlineLabelEqu) {
|
|
79
|
+
const exprText = inlineLabelEqu[2].trim();
|
|
80
|
+
return [
|
|
81
|
+
{
|
|
82
|
+
kind: 'AsmEqu',
|
|
83
|
+
span: stmtSpan,
|
|
84
|
+
name: inlineLabelEqu[1],
|
|
85
|
+
exprText,
|
|
86
|
+
value: parseImmExprFromText(filePath, exprText, stmtSpan, diagnostics, !isStringEquate(inlineLabelEqu[1], stringEquates)),
|
|
87
|
+
},
|
|
88
|
+
];
|
|
89
|
+
}
|
|
90
|
+
const bareEqu = /^([A-Za-z_][A-Za-z0-9_]*)\s+\.?equ\b\s*(.+)$/i.exec(trimmed);
|
|
91
|
+
if (bareEqu) {
|
|
92
|
+
const exprText = bareEqu[2].trim();
|
|
93
|
+
return [
|
|
94
|
+
{
|
|
95
|
+
kind: 'AsmEqu',
|
|
96
|
+
span: stmtSpan,
|
|
97
|
+
name: bareEqu[1],
|
|
98
|
+
exprText,
|
|
99
|
+
value: parseImmExprFromText(filePath, exprText, stmtSpan, diagnostics, !isStringEquate(bareEqu[1], stringEquates)),
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
}
|
|
103
|
+
const labelOnly = /^([A-Za-z_][A-Za-z0-9_]*)\s*:\s*$/.exec(trimmed);
|
|
104
|
+
if (labelOnly) {
|
|
105
|
+
return [{ kind: 'AsmLabel', span: stmtSpan, name: labelOnly[1] }];
|
|
106
|
+
}
|
|
107
|
+
if (parsedAsm?.kind === 'rawData') {
|
|
108
|
+
return [asmRawDataToNode(parsedAsm, stmtSpan, filePath, diagnostics, stringEquates)];
|
|
109
|
+
}
|
|
110
|
+
const bareRawText = normalizeRawDataDirectiveText(trimmed);
|
|
111
|
+
const bareRaw = bareRawText
|
|
112
|
+
? parseBareRawDataDirective(bareRawText, lineNo, stmtSpan, filePath, diagnostics)
|
|
113
|
+
: undefined;
|
|
114
|
+
if (bareRaw)
|
|
115
|
+
return [bareRaw];
|
|
116
|
+
const orgMatch = /^\.?org\b\s*(.*)$/i.exec(trimmed);
|
|
117
|
+
if (orgMatch) {
|
|
118
|
+
const exprText = orgMatch[1].trim();
|
|
119
|
+
return [
|
|
120
|
+
{
|
|
121
|
+
kind: 'AsmOrg',
|
|
122
|
+
span: stmtSpan,
|
|
123
|
+
exprText,
|
|
124
|
+
value: parseImmExprFromText(filePath, exprText, stmtSpan, diagnostics),
|
|
125
|
+
},
|
|
126
|
+
];
|
|
127
|
+
}
|
|
128
|
+
const parsed = parsedAsm;
|
|
129
|
+
if (!parsed)
|
|
130
|
+
return undefined;
|
|
131
|
+
if (parsed.kind === 'instruction' || parsed.kind === 'label')
|
|
132
|
+
return undefined;
|
|
133
|
+
switch (parsed.kind) {
|
|
134
|
+
case 'equ':
|
|
135
|
+
return [
|
|
136
|
+
{
|
|
137
|
+
kind: 'AsmEqu',
|
|
138
|
+
span: stmtSpan,
|
|
139
|
+
name: parsed.name,
|
|
140
|
+
exprText: parsed.exprText,
|
|
141
|
+
value: parseImmExprFromText(filePath, parsed.exprText, stmtSpan, diagnostics, !isStringEquate(parsed.name, stringEquates)),
|
|
142
|
+
},
|
|
143
|
+
];
|
|
144
|
+
case 'org':
|
|
145
|
+
return [
|
|
146
|
+
{
|
|
147
|
+
kind: 'AsmOrg',
|
|
148
|
+
span: stmtSpan,
|
|
149
|
+
exprText: parsed.exprText,
|
|
150
|
+
value: parseImmExprFromText(filePath, parsed.exprText, stmtSpan, diagnostics),
|
|
151
|
+
},
|
|
152
|
+
];
|
|
153
|
+
case 'binfrom':
|
|
154
|
+
return [
|
|
155
|
+
{
|
|
156
|
+
kind: 'AsmBinFrom',
|
|
157
|
+
span: stmtSpan,
|
|
158
|
+
exprText: parsed.exprText,
|
|
159
|
+
value: parseImmExprFromText(filePath, parsed.exprText, stmtSpan, diagnostics),
|
|
160
|
+
},
|
|
161
|
+
];
|
|
162
|
+
case 'binto':
|
|
163
|
+
return [
|
|
164
|
+
{
|
|
165
|
+
kind: 'AsmBinTo',
|
|
166
|
+
span: stmtSpan,
|
|
167
|
+
exprText: parsed.exprText,
|
|
168
|
+
value: parseImmExprFromText(filePath, parsed.exprText, stmtSpan, diagnostics),
|
|
169
|
+
},
|
|
170
|
+
];
|
|
171
|
+
case 'align': {
|
|
172
|
+
const value = parseImmExprFromText(filePath, parsed.exprText, stmtSpan, diagnostics);
|
|
173
|
+
return value ? [{ kind: 'AsmAlign', span: stmtSpan, value }] : [];
|
|
174
|
+
}
|
|
175
|
+
case 'end':
|
|
176
|
+
ctx.asmEnded = true;
|
|
177
|
+
return [{ kind: 'AsmEnd', span: stmtSpan }];
|
|
178
|
+
case 'unsupportedDirective':
|
|
179
|
+
diag(diagnostics, filePath, `Unsupported ASM80 directive ".${parsed.directive}".`, {
|
|
180
|
+
line: lineNo,
|
|
181
|
+
column: directiveColumn(trimmed, parsed.directive),
|
|
182
|
+
});
|
|
183
|
+
return [];
|
|
184
|
+
default:
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { AsmInstructionNode, SourceSpan } from './ast.js';
|
|
2
|
+
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
3
|
+
export declare function parseAsmInstruction(filePath: string, text: string, instrSpan: SourceSpan, diagnostics: Diagnostic[]): AsmInstructionNode | undefined;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { parseImmExprFromText } from './parseImm.js';
|
|
2
|
+
import { parseAsmOperand } from './parseOperands.js';
|
|
3
|
+
function splitTopLevelCommaSeparated(text) {
|
|
4
|
+
const parts = [];
|
|
5
|
+
let current = '';
|
|
6
|
+
let parenDepth = 0;
|
|
7
|
+
let bracketDepth = 0;
|
|
8
|
+
for (let i = 0; i < text.length; i++) {
|
|
9
|
+
const ch = text[i];
|
|
10
|
+
if (ch === '(') {
|
|
11
|
+
parenDepth++;
|
|
12
|
+
current += ch;
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
if (ch === ')') {
|
|
16
|
+
parenDepth = Math.max(parenDepth - 1, 0);
|
|
17
|
+
current += ch;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (ch === '[') {
|
|
21
|
+
bracketDepth++;
|
|
22
|
+
current += ch;
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (ch === ']') {
|
|
26
|
+
bracketDepth = Math.max(bracketDepth - 1, 0);
|
|
27
|
+
current += ch;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (ch === ',' && parenDepth === 0 && bracketDepth === 0) {
|
|
31
|
+
parts.push(current.trim());
|
|
32
|
+
current = '';
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
current += ch;
|
|
36
|
+
}
|
|
37
|
+
parts.push(current.trim());
|
|
38
|
+
return parts.filter((part) => part.length > 0);
|
|
39
|
+
}
|
|
40
|
+
export function parseAsmInstruction(filePath, text, instrSpan, diagnostics) {
|
|
41
|
+
const trimmed = text.trim();
|
|
42
|
+
if (trimmed.length === 0)
|
|
43
|
+
return undefined;
|
|
44
|
+
const firstSpace = trimmed.search(/\s/);
|
|
45
|
+
const head = firstSpace === -1 ? trimmed : trimmed.slice(0, firstSpace);
|
|
46
|
+
const headLower = head.toLowerCase();
|
|
47
|
+
const rest = firstSpace === -1 ? '' : trimmed.slice(firstSpace).trim();
|
|
48
|
+
const operands = [];
|
|
49
|
+
if (rest.length > 0) {
|
|
50
|
+
const preferDottedImmediate = filePath.toLowerCase().endsWith('.asm');
|
|
51
|
+
const parseInOutOperand = (operandText) => {
|
|
52
|
+
const t = operandText.trim();
|
|
53
|
+
if (t.startsWith('(') && t.endsWith(')')) {
|
|
54
|
+
const inner = t.slice(1, -1).trim();
|
|
55
|
+
if (/^c$/i.test(inner))
|
|
56
|
+
return { kind: 'PortC', span: instrSpan };
|
|
57
|
+
const expr = parseImmExprFromText(filePath, inner, instrSpan, diagnostics);
|
|
58
|
+
if (expr)
|
|
59
|
+
return { kind: 'PortImm8', span: instrSpan, expr };
|
|
60
|
+
}
|
|
61
|
+
return parseAsmOperand(filePath, t, instrSpan, diagnostics, true, preferDottedImmediate);
|
|
62
|
+
};
|
|
63
|
+
const parts = splitTopLevelCommaSeparated(rest);
|
|
64
|
+
for (const part of parts) {
|
|
65
|
+
const opNode = headLower === 'in' || headLower === 'out'
|
|
66
|
+
? parseInOutOperand(part)
|
|
67
|
+
: parseAsmOperand(filePath, part, instrSpan, diagnostics, true, preferDottedImmediate);
|
|
68
|
+
if (opNode)
|
|
69
|
+
operands.push(opNode);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return { kind: 'AsmInstruction', span: instrSpan, head: headLower, operands };
|
|
73
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AsmItemNode, SourceSpan } from './ast.js';
|
|
2
|
+
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
3
|
+
type ParsedAsmStatement = AsmItemNode | AsmItemNode[] | undefined;
|
|
4
|
+
export declare function appendParsedAsmStatement(out: AsmItemNode[], parsed: ParsedAsmStatement): void;
|
|
5
|
+
export declare function parseAsmStatement(filePath: string, text: string, stmtSpan: SourceSpan, diagnostics: Diagnostic[]): ParsedAsmStatement;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { parseAsmInstruction } from './parseAsmInstruction.js';
|
|
2
|
+
export function appendParsedAsmStatement(out, parsed) {
|
|
3
|
+
if (!parsed)
|
|
4
|
+
return;
|
|
5
|
+
if (Array.isArray(parsed)) {
|
|
6
|
+
out.push(...parsed);
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
out.push(parsed);
|
|
10
|
+
}
|
|
11
|
+
export function parseAsmStatement(filePath, text, stmtSpan, diagnostics) {
|
|
12
|
+
const trimmed = text.trim();
|
|
13
|
+
if (trimmed.length === 0)
|
|
14
|
+
return undefined;
|
|
15
|
+
return parseAsmInstruction(filePath, trimmed, stmtSpan, diagnostics);
|
|
16
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AsmInstructionNode, AsmLabelNode, SourceSpan } from './ast.js';
|
|
2
|
+
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
3
|
+
type AsmStreamItem = AsmLabelNode | AsmInstructionNode;
|
|
4
|
+
export declare function parseAsmStreamLine(args: {
|
|
5
|
+
rest: string;
|
|
6
|
+
filePath: string;
|
|
7
|
+
stmtSpan: SourceSpan;
|
|
8
|
+
diagnostics: Diagnostic[];
|
|
9
|
+
}): AsmStreamItem[] | undefined;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { appendParsedAsmStatement, parseAsmStatement } from './parseAsmStatements.js';
|
|
2
|
+
import { topLevelStartKeyword } from './parseTopLevelCommon.js';
|
|
3
|
+
export function parseAsmStreamLine(args) {
|
|
4
|
+
const { rest, filePath, stmtSpan, diagnostics } = args;
|
|
5
|
+
if (topLevelStartKeyword(rest) !== undefined)
|
|
6
|
+
return undefined;
|
|
7
|
+
const content = rest.trim();
|
|
8
|
+
if (content.length === 0)
|
|
9
|
+
return [];
|
|
10
|
+
const nodes = [];
|
|
11
|
+
const asmItems = [];
|
|
12
|
+
const labelMatch = /^(@?[A-Za-z_][A-Za-z0-9_]*|\.[A-Za-z_][A-Za-z0-9_]*)\s*:(?!\=)\s*(.*)$/.exec(content);
|
|
13
|
+
if (labelMatch) {
|
|
14
|
+
const rawName = labelMatch[1];
|
|
15
|
+
const isEntry = rawName.startsWith('@');
|
|
16
|
+
nodes.push({
|
|
17
|
+
kind: 'AsmLabel',
|
|
18
|
+
span: stmtSpan,
|
|
19
|
+
name: isEntry ? rawName.slice(1) : rawName,
|
|
20
|
+
...(isEntry ? { isEntry: true } : {}),
|
|
21
|
+
});
|
|
22
|
+
const remainder = labelMatch[2]?.trim() ?? '';
|
|
23
|
+
if (remainder.length > 0) {
|
|
24
|
+
appendParsedAsmStatement(asmItems, parseAsmStatement(filePath, remainder, stmtSpan, diagnostics));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
appendParsedAsmStatement(asmItems, parseAsmStatement(filePath, content, stmtSpan, diagnostics));
|
|
29
|
+
}
|
|
30
|
+
for (const item of asmItems)
|
|
31
|
+
nodes.push(item);
|
|
32
|
+
return nodes;
|
|
33
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
2
|
+
import type { SourceSpan } from './ast.js';
|
|
3
|
+
import type { DirectiveAliasPolicy } from './directiveAliases.js';
|
|
4
|
+
import type { ParseItemContext, ParseItemResult } from './parseSourceItemDispatch.js';
|
|
5
|
+
export interface ParseAsmTopLevelInput {
|
|
6
|
+
index: number;
|
|
7
|
+
filePath: string;
|
|
8
|
+
lineNo: number;
|
|
9
|
+
rest: string;
|
|
10
|
+
stmtSpan: SourceSpan;
|
|
11
|
+
diagnostics: Diagnostic[];
|
|
12
|
+
ctx: Extract<ParseItemContext, {
|
|
13
|
+
scope: 'source';
|
|
14
|
+
}>;
|
|
15
|
+
aliasPolicy?: DirectiveAliasPolicy;
|
|
16
|
+
asmStringEquates?: Map<string, string>;
|
|
17
|
+
}
|
|
18
|
+
export declare function parseAsmTopLevel(args: ParseAsmTopLevelInput): ParseItemResult | undefined;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { parseAsmStreamLine } from './parseAsmStream.js';
|
|
2
|
+
import { parseAsmFlatDirectiveLine } from './parseAsmFlatDirectiveLine.js';
|
|
3
|
+
import { topLevelStartKeyword } from './parseTopLevelCommon.js';
|
|
4
|
+
export function parseAsmTopLevel(args) {
|
|
5
|
+
const keyword = topLevelStartKeyword(args.rest);
|
|
6
|
+
if (keyword !== undefined) {
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
const directiveItems = parseAsmFlatDirectiveLine({
|
|
10
|
+
rest: args.rest,
|
|
11
|
+
stmtSpan: args.stmtSpan,
|
|
12
|
+
filePath: args.filePath,
|
|
13
|
+
lineNo: args.lineNo,
|
|
14
|
+
diagnostics: args.diagnostics,
|
|
15
|
+
ctx: args.ctx,
|
|
16
|
+
...(args.aliasPolicy ? { aliasPolicy: args.aliasPolicy } : {}),
|
|
17
|
+
stringEquates: args.asmStringEquates ?? new Map(),
|
|
18
|
+
});
|
|
19
|
+
if (directiveItems !== undefined) {
|
|
20
|
+
return { nextIndex: args.index + 1, nodes: directiveItems };
|
|
21
|
+
}
|
|
22
|
+
const asmItems = parseAsmStreamLine({
|
|
23
|
+
rest: args.rest,
|
|
24
|
+
filePath: args.filePath,
|
|
25
|
+
stmtSpan: args.stmtSpan,
|
|
26
|
+
diagnostics: args.diagnostics,
|
|
27
|
+
});
|
|
28
|
+
if (asmItems === undefined)
|
|
29
|
+
return undefined;
|
|
30
|
+
return {
|
|
31
|
+
nextIndex: args.index + 1,
|
|
32
|
+
nodes: asmItems,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Diagnostic, DiagnosticId, DiagnosticSeverity } from '../diagnosticTypes.js';
|
|
2
|
+
type ParseDiagLocation = {
|
|
3
|
+
line: number;
|
|
4
|
+
column: number;
|
|
5
|
+
};
|
|
6
|
+
export declare function parseDiag(diagnostics: Diagnostic[], file: string, message: string, where?: ParseDiagLocation): void;
|
|
7
|
+
export declare function parseDiagAt(diagnostics: Diagnostic[], file: string, message: string, line: number, column: number): void;
|
|
8
|
+
export declare function parseDiagAtWithId(diagnostics: Diagnostic[], file: string, id: DiagnosticId, severity: DiagnosticSeverity, message: string, where?: ParseDiagLocation): void;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { DiagnosticIds } from '../diagnosticTypes.js';
|
|
2
|
+
export function parseDiag(diagnostics, file, message, where) {
|
|
3
|
+
parseDiagAtWithId(diagnostics, file, DiagnosticIds.ParseError, 'error', message, where);
|
|
4
|
+
}
|
|
5
|
+
export function parseDiagAt(diagnostics, file, message, line, column) {
|
|
6
|
+
parseDiag(diagnostics, file, message, { line, column });
|
|
7
|
+
}
|
|
8
|
+
export function parseDiagAtWithId(diagnostics, file, id, severity, message, where) {
|
|
9
|
+
diagnostics.push({
|
|
10
|
+
id,
|
|
11
|
+
severity,
|
|
12
|
+
message,
|
|
13
|
+
file,
|
|
14
|
+
...(where ? { line: where.line, column: where.column } : {}),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EnumDeclNode, SourceSpan } from './ast.js';
|
|
2
|
+
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
3
|
+
type ParseEnumContext = {
|
|
4
|
+
diagnostics: Diagnostic[];
|
|
5
|
+
sourcePath: string;
|
|
6
|
+
lineNo: number;
|
|
7
|
+
text: string;
|
|
8
|
+
span: SourceSpan;
|
|
9
|
+
isReservedTopLevelName: (name: string) => boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare function parseEnumDecl(enumTail: string, ctx: ParseEnumContext): EnumDeclNode | undefined;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { parseDiag as diag } from './parseDiagnostics.js';
|
|
2
|
+
import { diagInvalidHeaderLine, formatIdentifierToken } from './parseTopLevelCommon.js';
|
|
3
|
+
export function parseEnumDecl(enumTail, ctx) {
|
|
4
|
+
const { diagnostics, sourcePath, lineNo, text, span, isReservedTopLevelName } = ctx;
|
|
5
|
+
const decl = enumTail;
|
|
6
|
+
const nameMatch = /^([A-Za-z_][A-Za-z0-9_]*)(?:\s+(.*))?$/.exec(decl);
|
|
7
|
+
if (!nameMatch) {
|
|
8
|
+
const invalidName = decl.split(/\s+/, 1)[0] ?? '';
|
|
9
|
+
if (invalidName.length > 0) {
|
|
10
|
+
diag(diagnostics, sourcePath, `Invalid enum name ${formatIdentifierToken(invalidName)}: expected <identifier>.`, { line: lineNo, column: 1 });
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
diagInvalidHeaderLine(diagnostics, sourcePath, 'enum declaration', text, '<name> <member>[, ...]', lineNo);
|
|
14
|
+
}
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
const name = nameMatch[1];
|
|
18
|
+
if (isReservedTopLevelName(name)) {
|
|
19
|
+
diag(diagnostics, sourcePath, `Invalid enum name "${name}": collides with a top-level keyword.`, {
|
|
20
|
+
line: lineNo,
|
|
21
|
+
column: 1,
|
|
22
|
+
});
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
const membersText = (nameMatch[2] ?? '').trim();
|
|
26
|
+
if (membersText.length === 0) {
|
|
27
|
+
diag(diagnostics, sourcePath, `Enum "${name}" must declare at least one member`, {
|
|
28
|
+
line: lineNo,
|
|
29
|
+
column: 1,
|
|
30
|
+
});
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
const rawParts = membersText.split(',').map((p) => p.trim());
|
|
34
|
+
if (rawParts.some((p) => p.length === 0)) {
|
|
35
|
+
diag(diagnostics, sourcePath, `Trailing commas are not permitted in enum member lists`, {
|
|
36
|
+
line: lineNo,
|
|
37
|
+
column: 1,
|
|
38
|
+
});
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
const members = [];
|
|
42
|
+
const membersLower = new Set();
|
|
43
|
+
for (const m of rawParts) {
|
|
44
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(m)) {
|
|
45
|
+
diag(diagnostics, sourcePath, `Invalid enum member name ${formatIdentifierToken(m)}: expected <identifier>.`, {
|
|
46
|
+
line: lineNo,
|
|
47
|
+
column: 1,
|
|
48
|
+
});
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (isReservedTopLevelName(m)) {
|
|
52
|
+
diag(diagnostics, sourcePath, `Invalid enum member name "${m}": collides with a top-level keyword.`, {
|
|
53
|
+
line: lineNo,
|
|
54
|
+
column: 1,
|
|
55
|
+
});
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const memberLower = m.toLowerCase();
|
|
59
|
+
if (membersLower.has(memberLower)) {
|
|
60
|
+
diag(diagnostics, sourcePath, `Duplicate enum member name "${m}".`, {
|
|
61
|
+
line: lineNo,
|
|
62
|
+
column: 1,
|
|
63
|
+
});
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
membersLower.add(memberLower);
|
|
67
|
+
members.push(m);
|
|
68
|
+
}
|
|
69
|
+
return { kind: 'EnumDecl', span, name, members };
|
|
70
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ImmExprNode, SourceSpan, TypeExprNode } from './ast.js';
|
|
2
|
+
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
3
|
+
export declare function immLiteral(filePath: string, s: SourceSpan, value: number): ImmExprNode;
|
|
4
|
+
export declare function parseTypeExprFromText(typeText: string, typeSpan: SourceSpan): TypeExprNode | undefined;
|
|
5
|
+
export declare function diagIfArrayLengthMissing(diagnostics: Diagnostic[], filePath: string, typeText: string, where: {
|
|
6
|
+
line: number;
|
|
7
|
+
column: number;
|
|
8
|
+
}): boolean;
|
|
9
|
+
export declare function parseNumberLiteral(text: string): number | undefined;
|
|
10
|
+
export declare function parseImmExprFromText(filePath: string, exprText: string, exprSpan: SourceSpan, diagnostics: Diagnostic[], emitDiagnostics?: boolean): ImmExprNode | undefined;
|