Use $ instead of _ in tokens

This commit is contained in:
Tony Garnock-Jones 2021-03-22 12:29:27 +01:00
parent 4814790d8e
commit 87dda48083
4 changed files with 19 additions and 14 deletions

View File

@ -1,3 +1,7 @@
export function isJsKeyword(s: string): boolean {
return JS_KEYWORDS.has(s);
}
export const JS_KEYWORDS = new Set([
'abstract',
'await',

View File

@ -23,7 +23,7 @@ export const $ref = Symbol.for("ref");
export const $schema = Symbol.for("schema");
export const $setof = Symbol.for("setof");
export const $tuple = Symbol.for("tuple");
export const $tuple_STAR_ = Symbol.for("tuple*");
export const $tuple$STAR$ = Symbol.for("tuple*");
export const $version = Symbol.for("version");
export const __lit5 = false;
@ -147,7 +147,7 @@ export namespace SimplePattern {
export namespace CompoundPattern {
export function rec(label: NamedPattern, fields: NamedPattern): CompoundPattern {return {"_variant": "rec", label, fields};};
export function tuple(patterns: Array<NamedPattern>): CompoundPattern {return {"_variant": "tuple", patterns};};
export function tuple_STAR_(fixed: Array<NamedPattern>, variable: NamedSimplePattern): CompoundPattern {return {"_variant": "tuple*", fixed, variable};};
export function tuple$STAR$(fixed: Array<NamedPattern>, variable: NamedSimplePattern): CompoundPattern {return {"_variant": "tuple*", fixed, variable};};
export function setof(pattern: SimplePattern): CompoundPattern {return {"_variant": "setof", pattern};};
export function dictof(key: SimplePattern, value: SimplePattern): CompoundPattern {return {"_variant": "dictof", key, value};};
export function dict(entries: DictionaryEntries): CompoundPattern {return {"_variant": "dict", entries};};
@ -175,7 +175,7 @@ export namespace NamedPattern {
export function anonymous(value: Pattern): NamedPattern {return {"_variant": "anonymous", value};};
}
export function NamedSimplePattern__(name: symbol, pattern: SimplePattern): NamedSimplePattern_ {return {name, pattern};}
export function NamedSimplePattern_(name: symbol, pattern: SimplePattern): NamedSimplePattern_ {return {name, pattern};}
export function Ref(module: ModulePath, name: symbol): Ref {return {module, name};}
@ -490,7 +490,7 @@ export function toCompoundPattern(v: _val): undefined | CompoundPattern {
if (result === void 0) {
if (_.Record.isRecord<_val, _.Tuple<_val>, _ptr>(v)) {
let _tmp8: (null) | undefined;
_tmp8 = _.is(v.label, $tuple_STAR_) ? null : void 0;
_tmp8 = _.is(v.label, $tuple$STAR$) ? null : void 0;
if (_tmp8 !== void 0) {
if (_.Array.isArray(v[0])) {
let _tmp9: (Array<_val>) | undefined;

View File

@ -2,7 +2,7 @@ import { Value, is, Position } from '@preserves/core';
import * as M from './gen/schema';
import { SchemaSyntaxError } from './error';
import type { AtomicType } from './compiler/type';
import { JS_KEYWORDS } from './compiler/jskw';
import { isJsKeyword } from './compiler/jskw';
export * from './gen/schema';
@ -15,17 +15,18 @@ export function isValidToken(s: string): boolean {
}
export function isValidJsId(s: string): boolean {
return /^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(s) && !JS_KEYWORDS.has(s);
return /^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(s) && !isJsKeyword(s);
}
export function jsId(v: string, kf?: () => string): string {
const s = v
.replace('_', '__')
.replace('*', '_STAR_');
return jsToken(v.replace('$', '$$').replace('*', '$STAR$'), kf);
}
export function jsToken(s: string, kf?: () => string): string {
if (isValidJsId(s)) return s;
if (isValidJsId('$' + s)) return '$' + s;
if (kf !== void 0) return kf();
throw new Error(`Internal error: idForLiteral needs to be completed (${v})`);
throw new Error(`Internal error: jsToken needs to be completed (${s})`);
}
export const ANDSYM = Symbol.for('&');
@ -110,7 +111,7 @@ export function addNameIfAbsent(p: M.NamedSimplePattern, k: M._val): M.NamedSimp
} else {
const s = namelike(k);
if (s !== void 0) {
return M.NamedSimplePattern.named(M.NamedSimplePattern__(Symbol.for(s), p.value));
return M.NamedSimplePattern.named(M.NamedSimplePattern_(Symbol.for(s), p.value));
} else {
return p;
}

View File

@ -164,7 +164,7 @@ function parseDefinition(name: symbol, body: Array<Input>): Definition {
const n = findName(input) || findName(input[0]);
if (n !== false) {
if (p._variant !== 'SimplePattern') namedMustBeSimple(position(input[0]));
return M.NamedPattern.named(M.NamedSimplePattern__(n, p.value));
return M.NamedPattern.named(M.NamedSimplePattern_(n, p.value));
}
return M.NamedPattern.anonymous(p);
}
@ -253,7 +253,7 @@ function parsePattern(name: symbol, body0: Array<Input>): Pattern {
if (name === false) {
return anonymous(recur(b));
}
return named(M.NamedSimplePattern__(name, parseSimple(b, p => p, () =>
return named(M.NamedSimplePattern_(name, parseSimple(b, p => p, () =>
namedMustBeSimple(position(b)))));
};
}
@ -281,7 +281,7 @@ function parsePattern(name: symbol, body0: Array<Input>): Pattern {
} else if (Array.isArray(item)) {
if (is(item[item.length - 1], M.DOTDOTDOT)) {
if (item.length < 2) complain();
return M.CompoundPattern.tuple_STAR_(
return M.CompoundPattern.tuple$STAR$(
item.slice(0, item.length - 2).map(maybeNamed),
maybeNamedSimple(item[item.length - 2]));
} else {