forked from GitHub/gf-core
Merge branch 'majestic' of github.com:GrammaticalFramework/gf-core into majestic
This commit is contained in:
@@ -1,11 +1,8 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
parser: '@typescript-eslint/parser',
|
||||
plugins: [
|
||||
'@typescript-eslint',
|
||||
],
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
]
|
||||
'standard-with-typescript'
|
||||
],
|
||||
parserOptions: {
|
||||
project: './tsconfig.json'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ const errs: ErrorInfo[] = [
|
||||
]
|
||||
|
||||
export default {
|
||||
lookup(errno: number): string | undefined {
|
||||
lookup (errno: number): string | undefined {
|
||||
return errs.find(err => err.errno === errno)?.description
|
||||
}
|
||||
}
|
||||
|
||||
40
src/runtime/javascript/expr.ts
Normal file
40
src/runtime/javascript/expr.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
export class Type {
|
||||
hypos!: Hypo[]
|
||||
name!: string
|
||||
exprs!: Expr[]
|
||||
}
|
||||
|
||||
export class Hypo {
|
||||
bind_type!: boolean
|
||||
var!: string
|
||||
type!: Type
|
||||
}
|
||||
|
||||
export class Expr {
|
||||
dummy!: string
|
||||
}
|
||||
|
||||
export class ExprAbs extends Expr {
|
||||
|
||||
}
|
||||
export class ExprApp extends Expr {
|
||||
|
||||
}
|
||||
export class ExprLit extends Expr {
|
||||
|
||||
}
|
||||
export class ExprMeta extends Expr {
|
||||
|
||||
}
|
||||
export class ExprFun extends Expr {
|
||||
|
||||
}
|
||||
export class ExprVar extends Expr {
|
||||
|
||||
}
|
||||
export class ExprTyped extends Expr {
|
||||
|
||||
}
|
||||
export class ExprImplArg extends Expr {
|
||||
|
||||
}
|
||||
68
src/runtime/javascript/ffi.ts
Normal file
68
src/runtime/javascript/ffi.ts
Normal file
@@ -0,0 +1,68 @@
|
||||
/* eslint-disable @typescript-eslint/naming-convention */
|
||||
|
||||
import ffi from 'ffi-napi'
|
||||
import ref, { Pointer } from 'ref-napi'
|
||||
import ref_struct from 'ref-struct-di'
|
||||
const Struct = ref_struct(ref)
|
||||
|
||||
export const PgfExpr = ref.refType(ref.types.void)
|
||||
export const PgfLiteral = ref.refType(ref.types.void)
|
||||
|
||||
const PgfUnmarshallerVtbl = Struct({
|
||||
eabs: ref.refType(ref.types.void),
|
||||
eapp: ref.refType(ref.types.void),
|
||||
elit: ref.refType(ref.types.void),
|
||||
emeta: ref.refType(ref.types.void),
|
||||
efun: ref.refType(ref.types.void),
|
||||
evar: ref.refType(ref.types.void),
|
||||
etyped: ref.refType(ref.types.void),
|
||||
eimplarg: ref.refType(ref.types.void),
|
||||
lint: ref.refType(ref.types.void),
|
||||
lflt: ref.refType(ref.types.void),
|
||||
lstr: ref.refType(ref.types.void),
|
||||
dtyp: ref.refType(ref.types.void),
|
||||
free_ref: ref.refType(ref.types.void)
|
||||
})
|
||||
export const PgfUnmarshaller = Struct({
|
||||
vtbl: ref.refType(PgfUnmarshallerVtbl)
|
||||
})
|
||||
|
||||
const elit = ffi.Callback(PgfExpr, [PgfUnmarshaller, PgfLiteral],
|
||||
function (self, lit: Pointer<any>): any { // eslint-disable-line @typescript-eslint/no-unused-vars
|
||||
console.log('myelit')
|
||||
console.log(' lit', lit)
|
||||
return lit.deref()
|
||||
})
|
||||
|
||||
const lint = ffi.Callback(PgfLiteral, [PgfUnmarshaller, ref.types.size_t, ref.refType(ref.types.uint)],
|
||||
function (self, size: number, val: Pointer<number>): any { // eslint-disable-line @typescript-eslint/no-unused-vars
|
||||
console.log('mylint')
|
||||
console.log(' size', size)
|
||||
console.log(' val', val.deref())
|
||||
// const x: number = val.deref()
|
||||
return val
|
||||
})
|
||||
|
||||
const free_ref = ffi.Callback(ref.types.void, [PgfUnmarshaller, ref.refType(ref.types.void)],
|
||||
function (self, x: any): void { // eslint-disable-line @typescript-eslint/no-unused-vars
|
||||
console.log('free_ref')
|
||||
})
|
||||
|
||||
const vtbl = new PgfUnmarshallerVtbl({
|
||||
eabs: ref.alloc('void').ref(),
|
||||
eapp: ref.alloc('void').ref(),
|
||||
elit: elit as any,
|
||||
emeta: ref.alloc('void').ref(),
|
||||
efun: ref.alloc('void').ref(),
|
||||
evar: ref.alloc('void').ref(),
|
||||
etyped: ref.alloc('void').ref(),
|
||||
eimplarg: ref.alloc('void').ref(),
|
||||
lint: lint as any,
|
||||
lflt: ref.alloc('void').ref(),
|
||||
lstr: ref.alloc('void').ref(),
|
||||
dtyp: ref.alloc('void').ref(),
|
||||
free_ref: free_ref as any
|
||||
})
|
||||
|
||||
export const unmarshaller = new PgfUnmarshaller({ vtbl: vtbl.ref() })
|
||||
export const marshaller = {}
|
||||
@@ -1,4 +1,9 @@
|
||||
/* eslint-disable @typescript-eslint/naming-convention */
|
||||
|
||||
import errno from './errno'
|
||||
import { Expr } from './expr'
|
||||
import { unmarshaller, PgfUnmarshaller, PgfExpr, PgfLiteral } from './ffi'
|
||||
|
||||
import ffi from 'ffi-napi'
|
||||
import ref, { Pointer } from 'ref-napi'
|
||||
import ref_struct, { StructObject } from 'ref-struct-di'
|
||||
@@ -38,19 +43,18 @@ const PgfType = ref.types.void // TODO
|
||||
const PgfTypeHypo = ref.types.void // TODO
|
||||
const PgfTypeHypoPtr = ref.refType(PgfTypeHypo)
|
||||
|
||||
const PgfExpr = ref.types.void // TODO
|
||||
const PgfLiteral = ref.types.void // TODO
|
||||
// const PgfExpr = ref.types.void // TODO
|
||||
// const PgfLiteral = ref.types.void // TODO
|
||||
|
||||
const PgfPrintContext = ref.types.void // TODO
|
||||
const PgfPrintContextPtr = ref.refType(PgfPrintContext)
|
||||
|
||||
const PgfUnmarshaller = ref.types.void // TODO
|
||||
// const PgfUnmarshaller = ref.types.void // TODO
|
||||
const PgfUnmarshallerPtr = ref.refType(PgfUnmarshaller)
|
||||
|
||||
const PgfMarshaller = ref.types.void // TODO
|
||||
const PgfMarshallerPtr = ref.refType(PgfMarshaller)
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// TypeScript Types
|
||||
|
||||
@@ -61,7 +65,7 @@ interface PgfExnType {
|
||||
}
|
||||
|
||||
class PGFError extends Error {
|
||||
constructor(message: string) {
|
||||
constructor (message: string) {
|
||||
super(message)
|
||||
// https://stackoverflow.com/a/65243177/98600
|
||||
Object.setPrototypeOf(this, PGFError.prototype)
|
||||
@@ -72,44 +76,44 @@ class PGFError extends Error {
|
||||
// FFI
|
||||
|
||||
const runtime = ffi.Library('libpgf', {
|
||||
'pgf_read_pgf': [ PgfDBPtr, [ ref.types.CString, PgfRevisionPtr, PgfExnPtr ] ],
|
||||
'pgf_boot_ngf': [ PgfDBPtr, [ ref.types.CString, ref.types.CString, PgfRevisionPtr, PgfExnPtr ] ],
|
||||
'pgf_read_ngf': [ PgfDBPtr, [ ref.types.CString, PgfRevisionPtr, PgfExnPtr ] ],
|
||||
'pgf_new_ngf': [ PgfDBPtr, [ PgfTextPtr, ref.types.CString, PgfRevisionPtr, PgfExnPtr ] ],
|
||||
'pgf_write_pgf': [ ref.types.void, [ ref.types.CString, PgfDBPtr, PgfRevision, PgfExnPtr ] ],
|
||||
pgf_read_pgf: [PgfDBPtr, [ref.types.CString, PgfRevisionPtr, PgfExnPtr]],
|
||||
pgf_boot_ngf: [PgfDBPtr, [ref.types.CString, ref.types.CString, PgfRevisionPtr, PgfExnPtr]],
|
||||
pgf_read_ngf: [PgfDBPtr, [ref.types.CString, PgfRevisionPtr, PgfExnPtr]],
|
||||
pgf_new_ngf: [PgfDBPtr, [PgfTextPtr, ref.types.CString, PgfRevisionPtr, PgfExnPtr]],
|
||||
pgf_write_pgf: [ref.types.void, [ref.types.CString, PgfDBPtr, PgfRevision, PgfExnPtr]],
|
||||
|
||||
'pgf_free_revision': [ ref.types.void, [ PgfDBPtr, PgfRevision ] ],
|
||||
pgf_free_revision: [ref.types.void, [PgfDBPtr, PgfRevision]],
|
||||
|
||||
'pgf_abstract_name': [ PgfTextPtr, [ PgfDBPtr, PgfRevision, PgfExnPtr ] ],
|
||||
'pgf_iter_categories': [ ref.types.void, [ PgfDBPtr, PgfRevision, PgfItorPtr, PgfExnPtr ] ],
|
||||
'pgf_start_cat': [ PgfType, [ PgfDBPtr, PgfRevision, PgfUnmarshallerPtr, PgfExnPtr ] ],
|
||||
'pgf_category_context': [ PgfTypeHypoPtr, [ PgfDBPtr, PgfRevision, PgfTextPtr, ref.refType(ref.types.size_t), PgfUnmarshallerPtr, PgfExnPtr ] ],
|
||||
'pgf_category_prob': [ prob_t, [ PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr ] ],
|
||||
'pgf_iter_functions': [ ref.types.void, [ PgfDBPtr, PgfRevision, PgfItorPtr, PgfExnPtr ] ],
|
||||
'pgf_iter_functions_by_cat': [ ref.types.void, [ PgfDBPtr, PgfRevision, PgfTextPtr, PgfItorPtr, PgfExnPtr ] ],
|
||||
'pgf_function_type': [ PgfType, [ PgfDBPtr, PgfRevision, PgfTextPtr, PgfUnmarshallerPtr, PgfExnPtr ] ],
|
||||
'pgf_function_is_constructor': [ ref.types.int, [ PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr ] ],
|
||||
'pgf_function_prob': [ prob_t, [ PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr ] ],
|
||||
'pgf_print_expr': [ PgfTextPtr, [ PgfExpr, PgfPrintContextPtr, ref.types.int, PgfMarshallerPtr ] ],
|
||||
'pgf_read_expr': [ PgfExpr, [ PgfTextPtr, PgfUnmarshallerPtr ] ],
|
||||
'pgf_read_expr_ex': [ PgfExpr, [ PgfTextPtr, ref.refType(ref.types.CString), PgfUnmarshallerPtr ] ],
|
||||
'pgf_expr_prob': [ prob_t, [ PgfDBPtr, PgfRevision, PgfExpr, PgfMarshallerPtr, PgfExnPtr ] ],
|
||||
'pgf_print_type': [ PgfTextPtr, [ PgfType, PgfPrintContextPtr, ref.types.int, PgfMarshallerPtr ] ],
|
||||
'pgf_print_context': [ PgfTextPtr, [ size_t, PgfTypeHypoPtr, PgfPrintContextPtr, ref.types.int, PgfMarshallerPtr ] ],
|
||||
'pgf_read_type': [ PgfType, [ PgfTextPtr, PgfUnmarshallerPtr ] ],
|
||||
pgf_abstract_name: [PgfTextPtr, [PgfDBPtr, PgfRevision, PgfExnPtr]],
|
||||
pgf_iter_categories: [ref.types.void, [PgfDBPtr, PgfRevision, PgfItorPtr, PgfExnPtr]],
|
||||
pgf_start_cat: [PgfType, [PgfDBPtr, PgfRevision, PgfUnmarshallerPtr, PgfExnPtr]],
|
||||
pgf_category_context: [PgfTypeHypoPtr, [PgfDBPtr, PgfRevision, PgfTextPtr, ref.refType(ref.types.size_t), PgfUnmarshallerPtr, PgfExnPtr]],
|
||||
pgf_category_prob: [prob_t, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]],
|
||||
pgf_iter_functions: [ref.types.void, [PgfDBPtr, PgfRevision, PgfItorPtr, PgfExnPtr]],
|
||||
pgf_iter_functions_by_cat: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfItorPtr, PgfExnPtr]],
|
||||
pgf_function_type: [PgfType, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfUnmarshallerPtr, PgfExnPtr]],
|
||||
pgf_function_is_constructor: [ref.types.int, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]],
|
||||
pgf_function_prob: [prob_t, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]],
|
||||
pgf_print_expr: [PgfTextPtr, [PgfExpr, PgfPrintContextPtr, ref.types.int, PgfMarshallerPtr]],
|
||||
pgf_read_expr: [PgfExpr, [PgfTextPtr, PgfUnmarshallerPtr]],
|
||||
pgf_read_expr_ex: [PgfExpr, [PgfTextPtr, ref.refType(ref.types.CString), PgfUnmarshallerPtr]],
|
||||
pgf_expr_prob: [prob_t, [PgfDBPtr, PgfRevision, PgfExpr, PgfMarshallerPtr, PgfExnPtr]],
|
||||
pgf_print_type: [PgfTextPtr, [PgfType, PgfPrintContextPtr, ref.types.int, PgfMarshallerPtr]],
|
||||
pgf_print_context: [PgfTextPtr, [size_t, PgfTypeHypoPtr, PgfPrintContextPtr, ref.types.int, PgfMarshallerPtr]],
|
||||
pgf_read_type: [PgfType, [PgfTextPtr, PgfUnmarshallerPtr]],
|
||||
|
||||
'pgf_clone_revision': [ PgfRevision, [ PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr ] ],
|
||||
'pgf_commit_revision': [ ref.types.void, [ PgfDBPtr, PgfRevision, PgfExnPtr ] ],
|
||||
'pgf_checkout_revision': [ PgfRevision, [ PgfDBPtr, PgfTextPtr, PgfExnPtr ] ],
|
||||
'pgf_create_function': [ ref.types.void, [ PgfDBPtr, PgfRevision, PgfTextPtr, PgfType, size_t, prob_t, PgfMarshallerPtr, PgfExnPtr ] ],
|
||||
'pgf_drop_function': [ ref.types.void, [ PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr ] ],
|
||||
'pgf_create_category': [ ref.types.void, [ PgfDBPtr, PgfRevision, PgfTextPtr, size_t, PgfTypeHypoPtr, prob_t, PgfMarshallerPtr, PgfExnPtr ] ],
|
||||
'pgf_drop_category': [ ref.types.void, [ PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr ] ],
|
||||
pgf_clone_revision: [PgfRevision, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]],
|
||||
pgf_commit_revision: [ref.types.void, [PgfDBPtr, PgfRevision, PgfExnPtr]],
|
||||
pgf_checkout_revision: [PgfRevision, [PgfDBPtr, PgfTextPtr, PgfExnPtr]],
|
||||
pgf_create_function: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfType, size_t, prob_t, PgfMarshallerPtr, PgfExnPtr]],
|
||||
pgf_drop_function: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]],
|
||||
pgf_create_category: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, size_t, PgfTypeHypoPtr, prob_t, PgfMarshallerPtr, PgfExnPtr]],
|
||||
pgf_drop_category: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]],
|
||||
|
||||
'pgf_get_global_flag': [ PgfLiteral, [ PgfDBPtr, PgfRevision, PgfTextPtr, PgfUnmarshallerPtr, PgfExnPtr ] ],
|
||||
'pgf_set_global_flag': [ ref.types.void, [ PgfDBPtr, PgfRevision, PgfTextPtr, PgfLiteral, PgfMarshallerPtr, PgfExnPtr ] ],
|
||||
'pgf_get_abstract_flag': [ PgfLiteral, [ PgfDBPtr, PgfRevision, PgfTextPtr, PgfUnmarshallerPtr, PgfExnPtr ] ],
|
||||
'pgf_set_abstract_flag': [ ref.types.void, [ PgfDBPtr, PgfRevision, PgfTextPtr, PgfLiteral, PgfMarshallerPtr, PgfExnPtr ] ],
|
||||
pgf_get_global_flag: [PgfLiteral, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfUnmarshallerPtr, PgfExnPtr]],
|
||||
pgf_set_global_flag: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfLiteral, PgfMarshallerPtr, PgfExnPtr]],
|
||||
pgf_get_abstract_flag: [PgfLiteral, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfUnmarshallerPtr, PgfExnPtr]],
|
||||
pgf_set_abstract_flag: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfLiteral, PgfMarshallerPtr, PgfExnPtr]]
|
||||
})
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -123,7 +127,7 @@ function handleError (err: StructObject<PgfExnType>): void {
|
||||
// PGF_EXN_SYSTEM_ERROR
|
||||
case 1: {
|
||||
const desc = errno.lookup(err.code)
|
||||
throw new Error(`${desc}: ${err.msg}`)
|
||||
throw new Error(`${desc as string}: ${err.msg as string}`)
|
||||
}
|
||||
// PGF_EXN_PGF_ERROR
|
||||
case 2:
|
||||
@@ -172,7 +176,7 @@ export class PGFGrammar {
|
||||
}
|
||||
|
||||
getAbstractName (): string {
|
||||
const err = new PgfExn
|
||||
const err = new PgfExn()
|
||||
const txt = runtime.pgf_abstract_name(this.db, this.revision.deref(), err.ref())
|
||||
handleError(err)
|
||||
return PgfText_AsString(txt)
|
||||
@@ -180,12 +184,12 @@ export class PGFGrammar {
|
||||
|
||||
getCategories (): string[] {
|
||||
const cats: string[] = []
|
||||
const callback = ffi.Callback(ref.types.void, [ PgfItorPtr, PgfTextPtr, voidPtr, PgfExnPtr ],
|
||||
const callback = ffi.Callback(ref.types.void, [PgfItorPtr, PgfTextPtr, voidPtr, PgfExnPtr],
|
||||
function (self: Pointer<any>, key: Pointer<any>, value: Pointer<any>, err: Pointer<any>) { // eslint-disable-line @typescript-eslint/no-unused-vars
|
||||
const k = PgfText_AsString(key)
|
||||
cats.push(k)
|
||||
})
|
||||
const err = new PgfExn
|
||||
})
|
||||
const err = new PgfExn()
|
||||
runtime.pgf_iter_categories(this.db, this.revision.deref(), callback.ref() as Pointer<void>, err.ref())
|
||||
handleError(err)
|
||||
return cats
|
||||
@@ -193,17 +197,62 @@ export class PGFGrammar {
|
||||
|
||||
getFunctions (): string[] {
|
||||
const funs: string[] = []
|
||||
const callback = ffi.Callback(ref.types.void, [ PgfItorPtr, PgfTextPtr, voidPtr, PgfExnPtr ],
|
||||
const callback = ffi.Callback(ref.types.void, [PgfItorPtr, PgfTextPtr, voidPtr, PgfExnPtr],
|
||||
function (self: Pointer<any>, key: Pointer<any>, value: Pointer<any>, err: Pointer<any>) { // eslint-disable-line @typescript-eslint/no-unused-vars
|
||||
const k = PgfText_AsString(key)
|
||||
funs.push(k)
|
||||
})
|
||||
const err = new PgfExn
|
||||
})
|
||||
const err = new PgfExn()
|
||||
runtime.pgf_iter_functions(this.db, this.revision.deref(), callback.ref() as Pointer<void>, err.ref())
|
||||
handleError(err)
|
||||
return funs
|
||||
}
|
||||
|
||||
categoryProbability (cat: string): number | undefined {
|
||||
const catname = PgfText_FromString(cat)
|
||||
const err = new PgfExn()
|
||||
const prob = runtime.pgf_category_prob(this.db, this.revision.deref(), catname, err.ref())
|
||||
handleError(err)
|
||||
if (prob === Infinity) {
|
||||
return undefined
|
||||
} else {
|
||||
return prob
|
||||
}
|
||||
}
|
||||
|
||||
functionProbability (fun: string): number | undefined {
|
||||
const funname = PgfText_FromString(fun)
|
||||
const err = new PgfExn()
|
||||
const prob = runtime.pgf_function_prob(this.db, this.revision.deref(), funname, err.ref())
|
||||
handleError(err)
|
||||
if (prob === Infinity) {
|
||||
return undefined
|
||||
} else {
|
||||
return prob
|
||||
}
|
||||
}
|
||||
|
||||
functionIsConstructor (fun: string): boolean {
|
||||
const funname = PgfText_FromString(fun)
|
||||
const err = new PgfExn()
|
||||
const isCon = runtime.pgf_function_is_constructor(this.db, this.revision.deref(), funname, err.ref())
|
||||
handleError(err)
|
||||
return Boolean(isCon)
|
||||
}
|
||||
|
||||
functionsByCategory (cat: string): string[] {
|
||||
const catname = PgfText_FromString(cat)
|
||||
const funs: string[] = []
|
||||
const callback = ffi.Callback(ref.types.void, [PgfItorPtr, PgfTextPtr, voidPtr, PgfExnPtr],
|
||||
function (self: Pointer<any>, key: Pointer<any>, value: Pointer<any>, err: Pointer<any>) { // eslint-disable-line @typescript-eslint/no-unused-vars
|
||||
const k = PgfText_AsString(key)
|
||||
funs.push(k)
|
||||
})
|
||||
const err = new PgfExn()
|
||||
runtime.pgf_iter_functions_by_cat(this.db, this.revision.deref(), catname, callback.ref() as Pointer<void>, err.ref())
|
||||
handleError(err)
|
||||
return funs
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -211,7 +260,7 @@ export class PGFGrammar {
|
||||
|
||||
function readPGF (path: string): PGFGrammar {
|
||||
const rev = ref.alloc(PgfRevisionPtr)
|
||||
const err = new PgfExn
|
||||
const err = new PgfExn()
|
||||
const db = runtime.pgf_read_pgf(path, rev, err.ref())
|
||||
handleError(err)
|
||||
return new PGFGrammar(db, rev)
|
||||
@@ -219,7 +268,7 @@ function readPGF (path: string): PGFGrammar {
|
||||
|
||||
function bootNGF (pgf_path: string, ngf_path: string): PGFGrammar {
|
||||
const rev = ref.alloc(PgfRevisionPtr)
|
||||
const err = new PgfExn
|
||||
const err = new PgfExn()
|
||||
const db = runtime.pgf_boot_ngf(pgf_path, ngf_path, rev, err.ref())
|
||||
handleError(err)
|
||||
return new PGFGrammar(db, rev)
|
||||
@@ -227,7 +276,7 @@ function bootNGF (pgf_path: string, ngf_path: string): PGFGrammar {
|
||||
|
||||
function readNGF (path: string): PGFGrammar {
|
||||
const rev = ref.alloc(PgfRevisionPtr)
|
||||
const err = new PgfExn
|
||||
const err = new PgfExn()
|
||||
const db = runtime.pgf_read_ngf(path, rev, err.ref())
|
||||
handleError(err)
|
||||
return new PGFGrammar(db, rev)
|
||||
@@ -237,12 +286,20 @@ function newNGF (abstract_name: string, path?: string): PGFGrammar {
|
||||
const absname = PgfText_FromString(abstract_name)
|
||||
const fpath = path != null ? path : null
|
||||
const rev = ref.alloc(PgfRevisionPtr)
|
||||
const err = new PgfExn
|
||||
const err = new PgfExn()
|
||||
const db = runtime.pgf_new_ngf(absname, fpath, rev, err.ref())
|
||||
handleError(err)
|
||||
return new PGFGrammar(db, rev)
|
||||
}
|
||||
|
||||
function readExpr (str: string): Expr {
|
||||
const txt = PgfText_FromString(str)
|
||||
const expr = runtime.pgf_read_expr(txt, unmarshaller.ref())
|
||||
console.log('expr', expr)
|
||||
|
||||
return new Expr()
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Exposed library API
|
||||
|
||||
@@ -251,5 +308,7 @@ export default {
|
||||
readPGF,
|
||||
bootNGF,
|
||||
readNGF,
|
||||
newNGF
|
||||
newNGF,
|
||||
|
||||
readExpr
|
||||
}
|
||||
|
||||
917
src/runtime/javascript/package-lock.json
generated
917
src/runtime/javascript/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -19,6 +19,10 @@
|
||||
"@typescript-eslint/eslint-plugin": "^4.32.0",
|
||||
"@typescript-eslint/parser": "^4.32.0",
|
||||
"eslint": "^7.32.0",
|
||||
"eslint-config-standard-with-typescript": "^21.0.1",
|
||||
"eslint-plugin-import": "^2.24.2",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-promise": "^5.1.0",
|
||||
"jest": "^27.2.4",
|
||||
"ts-jest": "^27.0.5",
|
||||
"typescript": "^4.4.3"
|
||||
|
||||
@@ -154,10 +154,55 @@ describe('abstract syntax', () => {
|
||||
})
|
||||
|
||||
test('categories', () => {
|
||||
expect(gr.getCategories()).toEqual(['Float','Int','N','P','S','String'])
|
||||
expect(gr.getCategories()).toEqual(['Float', 'Int', 'N', 'P', 'S', 'String'])
|
||||
})
|
||||
|
||||
test('functions', () => {
|
||||
expect(gr.getFunctions()).toEqual(['c','ind','s','z'])
|
||||
expect(gr.getFunctions()).toEqual(['c', 'ind', 's', 'z'])
|
||||
})
|
||||
|
||||
describe('function is constructor', () => {
|
||||
test('s', () => {
|
||||
expect(gr.functionIsConstructor('s')).toBe(true)
|
||||
})
|
||||
test('z', () => {
|
||||
expect(gr.functionIsConstructor('z')).toBe(true)
|
||||
})
|
||||
test('c', () => {
|
||||
expect(gr.functionIsConstructor('c')).toBe(true)
|
||||
})
|
||||
test('ind', () => {
|
||||
expect(gr.functionIsConstructor('ind')).toBe(false)
|
||||
})
|
||||
})
|
||||
|
||||
describe('functions by category', () => {
|
||||
test('N', () => {
|
||||
expect(gr.functionsByCategory('N')).toEqual(['s', 'z'])
|
||||
})
|
||||
test('S', () => {
|
||||
expect(gr.functionsByCategory('S')).toEqual(['c'])
|
||||
})
|
||||
test('X', () => {
|
||||
expect(gr.functionsByCategory('X')).toEqual([])
|
||||
})
|
||||
})
|
||||
|
||||
describe('probabilities', () => {
|
||||
test.skip('category existing', () => {
|
||||
expect(gr.categoryProbability('S')).toBeDefined()
|
||||
})
|
||||
|
||||
test('category non-existent', () => {
|
||||
expect(gr.categoryProbability('NP')).toBeUndefined()
|
||||
})
|
||||
|
||||
test('function existing', () => {
|
||||
expect(gr.functionProbability('c')).toBeDefined() // returns -0 (!)
|
||||
})
|
||||
|
||||
test('function non-existent', () => {
|
||||
expect(gr.functionProbability('mkC')).toBeUndefined()
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user