From a7e0ee43c5bd655143c8382543c56a77580379ca Mon Sep 17 00:00:00 2001 From: Fred Sauer Date: Sat, 28 Feb 2026 19:51:17 -0800 Subject: [PATCH 1/3] Z80 defb, defw, defm --- src/parser/lang-z80.grammar | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/parser/lang-z80.grammar b/src/parser/lang-z80.grammar index a4c5f063..b727186b 100644 --- a/src/parser/lang-z80.grammar +++ b/src/parser/lang-z80.grammar @@ -22,7 +22,12 @@ Directive { } PseudoOp { - @specialize + @specialize } Condition { From 6fd06aa2bf0d1d73b71b24e14aecfd1411cac37f Mon Sep 17 00:00:00 2001 From: Fred Sauer Date: Sat, 28 Feb 2026 19:57:12 -0800 Subject: [PATCH 2/3] 6502 sort, reformat --- src/parser/lang-6502.grammar | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/parser/lang-6502.grammar b/src/parser/lang-6502.grammar index 5dbee73e..544fba1c 100644 --- a/src/parser/lang-6502.grammar +++ b/src/parser/lang-6502.grammar @@ -22,7 +22,7 @@ Instruction { } Register { - @specialize + @specialize } Directive { @@ -31,12 +31,16 @@ Directive { PseudoOp { @specialize } @@ -56,20 +60,20 @@ CurrentAddress { Opcode { @specialize } From fe4612fd9b994034609d192d948e3db8a69b2709 Mon Sep 17 00:00:00 2001 From: Fred Sauer Date: Sat, 28 Feb 2026 20:14:20 -0800 Subject: [PATCH 3/3] 6502 add `hex` --- src/parser/lang-6502.grammar | 9 +++++++++ src/parser/lang-6502.ts | 2 ++ src/parser/tokens-6502.ts | 15 +++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 src/parser/tokens-6502.ts diff --git a/src/parser/lang-6502.grammar b/src/parser/lang-6502.grammar index 544fba1c..ad459dc3 100644 --- a/src/parser/lang-6502.grammar +++ b/src/parser/lang-6502.grammar @@ -9,6 +9,7 @@ Line { Statement { Instruction | Directive | + HexDirective | MacroDef | MacEnd | ControlOp | @@ -44,6 +45,14 @@ PseudoOp { > } +HexOp { @specialize } + +HexDirective { + HexOp HexByte* +} + +@external tokens hexTokenizer from "../../src/parser/tokens-6502" { HexByte } + Mac { @specialize } MacEnd { @specialize } diff --git a/src/parser/lang-6502.ts b/src/parser/lang-6502.ts index 17c8146b..97d65068 100644 --- a/src/parser/lang-6502.ts +++ b/src/parser/lang-6502.ts @@ -35,6 +35,8 @@ export const Lezer6502: LRLanguage = LRLanguage.define({ BinaryGt: t.compareOperator, UnaryLt: t.arithmeticOperator, UnaryGt: t.arithmeticOperator, + HexOp: t.definition(t.variableName), + HexByte: t.number, Mac: t.definitionKeyword, MacEnd: t.definitionKeyword, "MacroDef/Identifier": t.macroName, diff --git a/src/parser/tokens-6502.ts b/src/parser/tokens-6502.ts new file mode 100644 index 00000000..c5b51aeb --- /dev/null +++ b/src/parser/tokens-6502.ts @@ -0,0 +1,15 @@ +import { ExternalTokenizer } from "@lezer/lr" +import { HexByte } from "../../gen/parser/lang-6502.grammar.terms" + +function isHexDigit(ch: number) { + return (ch >= 48 && ch <= 57) || // 0-9 + (ch >= 65 && ch <= 70) || // A-F + (ch >= 97 && ch <= 102) // a-f +} + +export const hexTokenizer = new ExternalTokenizer((input) => { + if (!isHexDigit(input.peek(0)) || !isHexDigit(input.peek(1))) return + let len = 2 + while (isHexDigit(input.peek(len))) len++ + if (len % 2 === 0) input.acceptToken(HexByte, len) +})