mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-24 03:52:50 -06:00
Get marshalling of integers working
This commit is contained in:
@@ -11,7 +11,16 @@ export class Hypo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class Expr {
|
export class Expr {
|
||||||
dummy!: string
|
constructor (n?: number) {
|
||||||
|
if (n != null) {
|
||||||
|
return new ExprLit(n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toString (): string {
|
||||||
|
// TODO call showExpr
|
||||||
|
return this.toString()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ExprAbs extends Expr {
|
export class ExprAbs extends Expr {
|
||||||
@@ -21,7 +30,16 @@ export class ExprApp extends Expr {
|
|||||||
|
|
||||||
}
|
}
|
||||||
export class ExprLit extends Expr {
|
export class ExprLit extends Expr {
|
||||||
|
lit: Literal
|
||||||
|
constructor (l: Literal | number | string) {
|
||||||
|
super()
|
||||||
|
if (l instanceof Literal) this.lit = l
|
||||||
|
else this.lit = new Literal(l)
|
||||||
|
}
|
||||||
|
|
||||||
|
toString (): string {
|
||||||
|
return this.lit.toString()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
export class ExprMeta extends Expr {
|
export class ExprMeta extends Expr {
|
||||||
|
|
||||||
@@ -38,3 +56,14 @@ export class ExprTyped extends Expr {
|
|||||||
export class ExprImplArg extends Expr {
|
export class ExprImplArg extends Expr {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class Literal {
|
||||||
|
val: number | string
|
||||||
|
constructor (v: number | string) {
|
||||||
|
this.val = v
|
||||||
|
}
|
||||||
|
|
||||||
|
toString (): string {
|
||||||
|
return this.val.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
/* eslint-disable @typescript-eslint/naming-convention */
|
/* eslint-disable @typescript-eslint/naming-convention */
|
||||||
|
import { ExprLit, Literal } from './expr'
|
||||||
|
|
||||||
import ffi from 'ffi-napi'
|
import ffi from 'ffi-napi'
|
||||||
import ref, { Pointer } from 'ref-napi'
|
import ref, { Pointer } from 'ref-napi'
|
||||||
import ref_struct from 'ref-struct-di'
|
import ref_struct from 'ref-struct-di'
|
||||||
const Struct = ref_struct(ref)
|
const Struct = ref_struct(ref)
|
||||||
|
|
||||||
export const PgfExpr = ref.refType(ref.types.void)
|
export const PgfExpr = ref.refType(ref.types.Object)
|
||||||
export const PgfLiteral = ref.refType(ref.types.void)
|
export const PgfLiteral = ref.refType(ref.types.Object)
|
||||||
|
|
||||||
const PgfUnmarshallerVtbl = Struct({
|
const PgfUnmarshallerVtbl = Struct({
|
||||||
eabs: ref.refType(ref.types.void),
|
eabs: ref.refType(ref.types.void),
|
||||||
@@ -28,24 +29,25 @@ export const PgfUnmarshaller = Struct({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const elit = ffi.Callback(PgfExpr, [PgfUnmarshaller, PgfLiteral],
|
const elit = ffi.Callback(PgfExpr, [PgfUnmarshaller, PgfLiteral],
|
||||||
function (self, lit: Pointer<any>): any { // eslint-disable-line @typescript-eslint/no-unused-vars
|
function (self, lit: Pointer<any>): Pointer<ExprLit> {
|
||||||
console.log('myelit')
|
const litObj = lit.deref() as Literal
|
||||||
console.log(' lit', lit)
|
const obj = new ExprLit(litObj)
|
||||||
return lit.deref()
|
const buf = ref.alloc(ref.types.Object) as Pointer<ExprLit>
|
||||||
|
ref.writeObject(buf, 0, obj)
|
||||||
|
return buf
|
||||||
})
|
})
|
||||||
|
|
||||||
const lint = ffi.Callback(PgfLiteral, [PgfUnmarshaller, ref.types.size_t, ref.refType(ref.types.uint)],
|
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
|
function (self, size: number, val: Pointer<number>): Pointer<Literal> {
|
||||||
console.log('mylint')
|
const obj = new Literal(val.deref())
|
||||||
console.log(' size', size)
|
const buf = ref.alloc(ref.types.Object) as Pointer<Literal>
|
||||||
console.log(' val', val.deref())
|
ref.writeObject(buf, 0, obj)
|
||||||
// const x: number = val.deref()
|
return buf
|
||||||
return val
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const free_ref = ffi.Callback(ref.types.void, [PgfUnmarshaller, ref.refType(ref.types.void)],
|
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
|
function (self, x: any): void {
|
||||||
console.log('free_ref')
|
// console.log('free_ref')
|
||||||
})
|
})
|
||||||
|
|
||||||
const vtbl = new PgfUnmarshallerVtbl({
|
const vtbl = new PgfUnmarshallerVtbl({
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/naming-convention */
|
/* eslint-disable @typescript-eslint/naming-convention */
|
||||||
|
|
||||||
import errno from './errno'
|
import errno from './errno'
|
||||||
import { Expr } from './expr'
|
import { Expr, ExprLit } from './expr'
|
||||||
import { unmarshaller, PgfUnmarshaller, PgfExpr, PgfLiteral } from './ffi'
|
import { unmarshaller, PgfUnmarshaller, PgfExpr, PgfLiteral } from './ffi'
|
||||||
|
|
||||||
import ffi from 'ffi-napi'
|
import ffi from 'ffi-napi'
|
||||||
@@ -185,7 +185,7 @@ export class PGFGrammar {
|
|||||||
getCategories (): string[] {
|
getCategories (): string[] {
|
||||||
const cats: 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
|
function (self: Pointer<any>, key: Pointer<any>, value: Pointer<any>, err: Pointer<any>) {
|
||||||
const k = PgfText_AsString(key)
|
const k = PgfText_AsString(key)
|
||||||
cats.push(k)
|
cats.push(k)
|
||||||
})
|
})
|
||||||
@@ -198,7 +198,7 @@ export class PGFGrammar {
|
|||||||
getFunctions (): string[] {
|
getFunctions (): string[] {
|
||||||
const funs: 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
|
function (self: Pointer<any>, key: Pointer<any>, value: Pointer<any>, err: Pointer<any>) {
|
||||||
const k = PgfText_AsString(key)
|
const k = PgfText_AsString(key)
|
||||||
funs.push(k)
|
funs.push(k)
|
||||||
})
|
})
|
||||||
@@ -244,7 +244,7 @@ export class PGFGrammar {
|
|||||||
const catname = PgfText_FromString(cat)
|
const catname = PgfText_FromString(cat)
|
||||||
const funs: 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
|
function (self: Pointer<any>, key: Pointer<any>, value: Pointer<any>, err: Pointer<any>) {
|
||||||
const k = PgfText_AsString(key)
|
const k = PgfText_AsString(key)
|
||||||
funs.push(k)
|
funs.push(k)
|
||||||
})
|
})
|
||||||
@@ -295,9 +295,7 @@ function newNGF (abstract_name: string, path?: string): PGFGrammar {
|
|||||||
function readExpr (str: string): Expr {
|
function readExpr (str: string): Expr {
|
||||||
const txt = PgfText_FromString(str)
|
const txt = PgfText_FromString(str)
|
||||||
const expr = runtime.pgf_read_expr(txt, unmarshaller.ref())
|
const expr = runtime.pgf_read_expr(txt, unmarshaller.ref())
|
||||||
console.log('expr', expr)
|
return ref.readObject(expr) as Expr
|
||||||
|
|
||||||
return new Expr()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -310,5 +308,8 @@ export default {
|
|||||||
readNGF,
|
readNGF,
|
||||||
newNGF,
|
newNGF,
|
||||||
|
|
||||||
readExpr
|
readExpr,
|
||||||
|
|
||||||
|
Expr,
|
||||||
|
ExprLit
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -206,3 +206,29 @@ describe('abstract syntax', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
describe('expressions', () => {
|
||||||
|
test('small integer', () => {
|
||||||
|
const e1 = PGF.readExpr('123')
|
||||||
|
const e2 = new PGF.ExprLit(123)
|
||||||
|
const e3 = new PGF.ExprLit(456)
|
||||||
|
expect(e1).toEqual(e2)
|
||||||
|
expect(e1).not.toEqual(e3)
|
||||||
|
})
|
||||||
|
|
||||||
|
test.skip('negative integer', () => {
|
||||||
|
const e1 = PGF.readExpr('-123')
|
||||||
|
const e2 = new PGF.ExprLit(-123)
|
||||||
|
const e3 = new PGF.ExprLit(-456)
|
||||||
|
expect(e1).toEqual(e2)
|
||||||
|
expect(e1).not.toEqual(e3)
|
||||||
|
})
|
||||||
|
|
||||||
|
// test.only('big integer', () => {
|
||||||
|
// const e1 = PGF.readExpr('774763251095801167872')
|
||||||
|
// const e2 = new PGF.ExprLit(BigInt(774763251095801167872))
|
||||||
|
// expect(e1).toEqual(e2)
|
||||||
|
// })
|
||||||
|
})
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "es5",
|
"target": "ES2015",
|
||||||
"module": "commonjs",
|
"module": "commonjs",
|
||||||
"rootDir": "./",
|
"rootDir": "./",
|
||||||
"moduleResolution": "node",
|
"moduleResolution": "node",
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
# Project moved
|
|
||||||
|
|
||||||
The GF TypeScript runtime has been moved to the repository:
|
|
||||||
<https://github.com/GrammaticalFramework/gf-typescript>
|
|
||||||
|
|
||||||
If you are looking for an updated version of the JavaScript runtime,
|
|
||||||
you should also look there.
|
|
||||||
Reference in New Issue
Block a user