feat(developer): stripped compile targets out of the parser

This commit is contained in:
Dr Mark C. Sinclair 2026-09-29 11:40:10 +01:00
parent bbbb7b3759
commit 626ed855ac
5 changed files with 9 additions and 98 deletions

View file

@ -160,35 +160,15 @@ export class KmnTreeRebuild extends ASTRebuild {
}
/**
* (BNF) line: compileTarget? content? NEWLINE
* (BNF) line: content? NEWLINE
*/
export class LineRule extends SingleChildRule {
public constructor() {
super();
const compileTarget = new CompileTargetRule();
const optCompileTarget = new OptionalRule(compileTarget);
const content = new ContentRule();
const optContent = new OptionalRule(content);
const newline = new TokenRule(TokenType.NEWLINE, true);
this.rule = new SequenceRule([optCompileTarget, optContent, newline]);
}
}
/**
* (BNF) compileTarget: KEYMAN|KEYMANONLY|KEYMANWEB|KMFL|WEAVER
*
* https://help.keyman.com/developer/language/guide/compile-targets
*/
export class CompileTargetRule extends AlternateTokenRule {
// TODO-NG-COMPILER: warning/error for compile targets
public constructor() {
super([
TokenType.KEYMAN,
TokenType.KEYMANONLY,
TokenType.KEYMANWEB,
TokenType.KMFL,
TokenType.WEAVER,
], true);
const content = new ContentRule();
const optContent = new OptionalRule(content);
const newline = new TokenRule(TokenType.NEWLINE, true);
this.rule = new SequenceRule([optContent, newline]);
}
}

View file

@ -1,6 +1,5 @@
kmnTree: line*
line: compileTarget? content? NEWLINE
compileTarget: KEYMAN|KEYMANONLY|KEYMANWEB|KMFL|WEAVER
line: content? NEWLINE
content: systemStoreAssign|capsAlwaysOff|capsOnOnly|shiftFreesCaps|
headerAssign|normalStoreAssign|ruleBlock
text: plainText|outsStatement

View file

@ -76,18 +76,10 @@ export const TOKEN_TO_NODE = [
{tokenType: TokenType.INDEX, nodeType: NodeType.INDEX},
// https://help.keyman.com/developer/language/reference/keyboardversion
{tokenType: TokenType.KEYBOARDVERSION, nodeType: NodeType.KEYBOARDVERSION},
// https://help.keyman.com/developer/language/guide/compile-targets
{tokenType: TokenType.KEYMAN, nodeType: NodeType.KEYMAN},
// https://help.keyman.com/developer/language/guide/compile-targets
{tokenType: TokenType.KEYMANONLY, nodeType: NodeType.KEYMANONLY},
// https://help.keyman.com/developer/language/guide/compile-targets
{tokenType: TokenType.KEYMANWEB, nodeType: NodeType.KEYMANWEB},
// https://help.keyman.com/developer/language/reference/group
{tokenType: TokenType.KEYS, nodeType: NodeType.KEYS},
// https://help.keyman.com/developer/language/guide/virtual-keys
{tokenType: TokenType.KEY_CODE, nodeType: NodeType.KEY_CODE},
// https://help.keyman.com/developer/language/guide/compile-targets
{tokenType: TokenType.KMFL, nodeType: NodeType.KMFL},
// https://help.keyman.com/developer/language/reference/kmw_embedcss
{tokenType: TokenType.KMW_EMBEDCSS, nodeType: NodeType.KMW_EMBEDCSS},
// https://help.keyman.com/developer/language/reference/kmw_embedjs
@ -192,8 +184,6 @@ export const TOKEN_TO_NODE = [
{tokenType: TokenType.VERSION_HEADER, nodeType: NodeType.VERSION_HEADER},
// https://help.keyman.com/developer/language/reference/visualkeyboard
{tokenType: TokenType.VISUALKEYBOARD, nodeType: NodeType.VISUALKEYBOARD},
// https://help.keyman.com/developer/language/guide/compile-targets
{tokenType: TokenType.WEAVER, nodeType: NodeType.WEAVER},
// https://help.keyman.com/developer/language/reference/windowslanguages
{tokenType: TokenType.WINDOWSLANGUAGES, nodeType: NodeType.WINDOWSLANGUAGES},
];

View file

@ -29,7 +29,7 @@ const EXCLUDED_REPOSITORY_FILES = [
'release\\e\\eo_plus\\source\\eo_plus',
'release\\g\\galaxie_greek_mnemonic\\source\\galaxie_greek_mnemonic',
'release\\g\\galaxie_greek_positional\\source\\galaxie_greek_positional',
'\\release\\g\\galaxie_hebrew_mnemonic\\source\\galaxie_hebrew_mnemonic',
'release\\g\\galaxie_hebrew_mnemonic\\source\\galaxie_hebrew_mnemonic',
'release\\g\\greekclassical\\source\\greekclassical',
'release\\gff\\gff_amharic\\source\\gff_amharic',
'release\\gff\\gff_amharic_classic\\source\\gff_amharic_classic',
@ -43,7 +43,7 @@ const EXCLUDED_REPOSITORY_FILES = [
'release\\gff\\gff_harari\\source\\gff_harari',
'release\\gff\\gff_tigre\\source\\gff_tigre',
'release\\gff\\gff_tigrinya_eritrea\\source\\gff_tigrinya_eritrea',
'release/gff/gff_tigrinya_ethiopia/source/gff_tigrinya_ethiopia',
'release\\gff\\gff_tigrinya_ethiopia\\source\\gff_tigrinya_ethiopia',
'release\\h\\hieroglyphic\\source\\hieroglyphic',
'release\\itrans\\itrans_bengali\\source\\itrans_bengali',
'release\\itrans\\itrans_devanagari_hindi\\source\\itrans_devanagari_hindi',

View file

@ -11,7 +11,7 @@ import { assert } from 'chai';
import { Rule } from '../../src/ng-compiler/recursive-descent.js';
import { Lexer, Token } from '../../src/ng-compiler/lexer.js';
import { TokenBuffer } from '../../src/ng-compiler/token-buffer.js';
import { BeginStatementRule, CompileTargetRule, ContentRule, EntryPointRule, GroupNameRule, KeystrokeElementRule, Parser } from '../../src/ng-compiler/kmn-analyzer.js';
import { BeginStatementRule, ContentRule, EntryPointRule, GroupNameRule, KeystrokeElementRule, Parser } from '../../src/ng-compiler/kmn-analyzer.js';
import { GroupQualifierRule, GroupStatementRule, InputBlockRule, InputContextRule, InputElementRule } from '../../src/ng-compiler/kmn-analyzer.js';
import { KeystrokeRule, KmnTreeRule, LhsBlockRule, LineRule, ModifierRule } from '../../src/ng-compiler/kmn-analyzer.js';
import { OutputStatementRule, PermittedKeywordRule, PlainTextRule, ProductionBlockRule, RhsBlockRule } from '../../src/ng-compiler/kmn-analyzer.js';
@ -194,64 +194,6 @@ describe("KMN Analyser Tests", () => {
assert.equal(root.getSoleChild().nodeType, NodeType.LINE);
assert.isFalse(root.getSoleChild().hasChildren());
});
it("can parse correctly (compile target)", () => {
tokenBuffer = stringToTokenBuffer('$keyman: store(&bitmap) "filename"\n');
const line: Rule = new LineRule();
assert.isTrue(line.parse(tokenBuffer, root));
const children = root.getChildren();
assert.equal(children.length, 3);
assert.equal(children[0].nodeType, NodeType.KEYMAN);
assert.equal(children[1].nodeType, NodeType.BITMAP);
assert.equal(children[1].getSoleChild().nodeType, NodeType.STRING);
assert.equal(children[2].nodeType, NodeType.LINE);
});
it("can parse correctly (compile target, plus, virtual key, u_char)", () => {
tokenBuffer = stringToTokenBuffer('$keymanonly: + [CTRL "."] > U+135E\n');
const line: Rule = new LineRule();
assert.isTrue(line.parse(tokenBuffer, root));
const children = root.getChildren();
assert.equal(children.length, 3);
assert.equal(children[0].nodeType, NodeType.KEYMANONLY);
assert.equal(children[1].nodeType, NodeType.PRODUCTION);
assert.equal(children[2].nodeType, NodeType.LINE);
});
});
describe("CompileTargetRule Tests", () => {
it("can construct a CompileTargetRule", () => {
tokenBuffer = stringToTokenBuffer('');
const compileTarget: Rule = new CompileTargetRule();
assert.isNotNull(compileTarget);
});
it("can parse correctly (KEYMAN)", () => {
tokenBuffer = stringToTokenBuffer('$keyman:');
const compileTarget: Rule = new CompileTargetRule();
assert.isTrue(compileTarget.parse(tokenBuffer, root));
assert.isNotNull(root.getSoleChildOfType(NodeType.KEYMAN));
});
it("can parse correctly (KEYMANONLY)", () => {
tokenBuffer = stringToTokenBuffer('$keymanonly:');
const compileTarget: Rule = new CompileTargetRule();
assert.isTrue(compileTarget.parse(tokenBuffer, root));
assert.isNotNull(root.getSoleChildOfType(NodeType.KEYMANONLY));
});
it("can parse correctly (KEYMANWEB)", () => {
tokenBuffer = stringToTokenBuffer('$keymanweb:');
const compileTarget: Rule = new CompileTargetRule();
assert.isTrue(compileTarget.parse(tokenBuffer, root));
assert.isNotNull(root.getSoleChildOfType(NodeType.KEYMANWEB));
});
it("can parse correctly (KMFL)", () => {
tokenBuffer = stringToTokenBuffer('$kmfl:');
const compileTarget: Rule = new CompileTargetRule();
assert.isTrue(compileTarget.parse(tokenBuffer, root));
assert.isNotNull(root.getSoleChildOfType(NodeType.KMFL));
});
it("can parse correctly (WEAVER)", () => {
tokenBuffer = stringToTokenBuffer('$weaver:');
const compileTarget: Rule = new CompileTargetRule();
assert.isTrue(compileTarget.parse(tokenBuffer, root));
assert.isNotNull(root.getSoleChildOfType(NodeType.WEAVER));
});
});
describe("ContentRule Tests", () => {
it("can construct a ContentRule", () => {