From 3e68339213505758928640c1dea4236f22d4ca42 Mon Sep 17 00:00:00 2001 From: Rerrah Date: Mon, 3 Nov 2025 20:51:22 +0900 Subject: [PATCH] Support comma seperated PMD's MML import --- features/instrument/formats/pmd/grammar.cjs | 66 +++++++++++-------- features/instrument/formats/pmd/grammar.ne | 21 +++--- .../instrument/formats/pmd/parser.test.ts | 4 +- 3 files changed, 50 insertions(+), 41 deletions(-) diff --git a/features/instrument/formats/pmd/grammar.cjs b/features/instrument/formats/pmd/grammar.cjs index 9dfcc94..7f3b825 100644 --- a/features/instrument/formats/pmd/grammar.cjs +++ b/features/instrument/formats/pmd/grammar.cjs @@ -8,7 +8,7 @@ const moo = require("moo"); const lexer = moo.compile({ - space: /[ \t]+/, + separators: /[, \t]+/, number: /[0-9]+/, command_sig: /@/, eol: { match: /\r?\n/, lineBreaks: true }, @@ -24,15 +24,15 @@ name: "instrument", symbols: [ "command_header", - "spaces", + "separators", "al_fb", - "spaces", + "separators", "operator", - "spaces", + "separators", "operator", - "spaces", + "separators", "operator", - "spaces", + "separators", "operator", ], postprocess: (d) => ({ @@ -45,7 +45,9 @@ }, { name: "command_header$ebnf$1", - symbols: [lexer.has("space") ? { type: "space" } : space], + symbols: [ + lexer.has("separators") ? { type: "separators" } : separators, + ], postprocess: id, }, { @@ -65,30 +67,30 @@ }, { name: "al_fb", - symbols: ["number", "spaces", "number"], + symbols: ["number", "separators", "number"], postprocess: (d) => ({ al: d[0], fb: d[2] }), }, { name: "operator", symbols: [ "number", - "spaces", + "separators", "number", - "spaces", + "separators", "number", - "spaces", + "separators", "number", - "spaces", + "separators", "number", - "spaces", + "separators", "number", - "spaces", + "separators", "number", - "spaces", + "separators", "number", - "spaces", + "separators", "number", - "spaces", + "separators", "number", ], postprocess: (d) => { @@ -108,42 +110,48 @@ }, }, { - name: "spaces", - symbols: [lexer.has("space") ? { type: "space" } : space], + name: "separators", + symbols: [ + lexer.has("separators") ? { type: "separators" } : separators, + ], }, { - name: "spaces$subexpression$1$ebnf$1", - symbols: [lexer.has("space") ? { type: "space" } : space], + name: "separators$subexpression$1$ebnf$1", + symbols: [ + lexer.has("separators") ? { type: "separators" } : separators, + ], postprocess: id, }, { - name: "spaces$subexpression$1$ebnf$1", + name: "separators$subexpression$1$ebnf$1", symbols: [], postprocess: function (d) { return null; }, }, { - name: "spaces$subexpression$1$ebnf$2", - symbols: [lexer.has("space") ? { type: "space" } : space], + name: "separators$subexpression$1$ebnf$2", + symbols: [ + lexer.has("separators") ? { type: "separators" } : separators, + ], postprocess: id, }, { - name: "spaces$subexpression$1$ebnf$2", + name: "separators$subexpression$1$ebnf$2", symbols: [], postprocess: function (d) { return null; }, }, { - name: "spaces$subexpression$1", + name: "separators$subexpression$1", symbols: [ - "spaces$subexpression$1$ebnf$1", + "separators$subexpression$1$ebnf$1", lexer.has("eol") ? { type: "eol" } : eol, - "spaces$subexpression$1$ebnf$2", + "separators$subexpression$1$ebnf$2", ], }, - { name: "spaces", symbols: ["spaces$subexpression$1"] }, + { name: "separators", symbols: ["separators$subexpression$1"] }, { name: "number", symbols: [lexer.has("number") ? { type: "number" } : number], diff --git a/features/instrument/formats/pmd/grammar.ne b/features/instrument/formats/pmd/grammar.ne index 1120a20..a0fab80 100644 --- a/features/instrument/formats/pmd/grammar.ne +++ b/features/instrument/formats/pmd/grammar.ne @@ -2,7 +2,7 @@ const moo = require("moo"); const lexer = moo.compile({ - space: /[ \t]+/, + separators: /[, \t]+/, number: /[0-9]+/, command_sig: /@/, eol: { match: /\r?\n/, lineBreaks: true }, @@ -14,11 +14,11 @@ function parseBool(n) { return n === 1; } @lexer lexer instrument -> - command_header spaces al_fb - spaces operator - spaces operator - spaces operator - spaces operator {% + command_header separators al_fb + separators operator + separators operator + separators operator + separators operator {% d => ({ ...(d[2]), op: [d[4], d[6], d[8], d[10]], @@ -28,14 +28,15 @@ instrument -> }) %} -command_header -> %command_sig %space:? number +command_header -> %command_sig %separators:? number -al_fb -> number spaces number {% +al_fb -> number separators number {% d => ({ al: d[0], fb: d[2] }) %} operator -> - number spaces number spaces number spaces number spaces number spaces number spaces number spaces number spaces number spaces number {% + number separators number separators number separators number separators number separators + number separators number separators number separators number separators number {% d => { return { ar: d[0], @@ -53,5 +54,5 @@ operator -> } %} -spaces -> %space | (%space:? %eol %space:?) +separators -> %separators | (%separators:? %eol %separators:?) number -> %number {% d => parseInt(d, 10) %} diff --git a/features/instrument/formats/pmd/parser.test.ts b/features/instrument/formats/pmd/parser.test.ts index 68666b8..81a5f55 100644 --- a/features/instrument/formats/pmd/parser.test.ts +++ b/features/instrument/formats/pmd/parser.test.ts @@ -67,14 +67,14 @@ describe("PMD parse", () => { const text = `@0 ;comment 4 5 -31 8 0 7 12 20 0 2 7 0 +31 8 0 7 12 20,0 2 7 0 31 5 2 7 6 4 0 2\`dummy\` 3 0 31 7 4 7\` dummy 2 \` -10 18 0 2 3 0 +10 18 0 2 3 0 31 0 4 7 0 0 0 2 0 1`; expect(parse(text)).toEqual(instrument);