forked from GitHub/gf-core
Merge branch 'master' of https://github.com/GrammaticalFramework/gf-core
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
# Deprecation notice
|
||||||
|
|
||||||
|
As of June 2019, this JavaScript version of the GF runtime is considered deprecated,
|
||||||
|
in favour of the TypeScript version in `../typescript/gflib.ts`.
|
||||||
|
|
||||||
|
If you don't want/need TypeScript and are just looking for a ready-to-use JavaScript version,
|
||||||
|
see `../typescript/js/gflib.js` which is generated directly from the TypeScript version.
|
||||||
+398
-398
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"plugins": ["@typescript-eslint"],
|
||||||
|
"extends": ["plugin:@typescript-eslint/recommended"],
|
||||||
|
"rules": {
|
||||||
|
"indent": "off",
|
||||||
|
"@typescript-eslint/indent": ["warn", 2],
|
||||||
|
"@typescript-eslint/no-use-before-define": ["error", {
|
||||||
|
"functions": false,
|
||||||
|
"classes": false
|
||||||
|
}],
|
||||||
|
"semi": "off",
|
||||||
|
"@typescript-eslint/semi": ["warn", "never"],
|
||||||
|
"quotes": ["warn", "single"],
|
||||||
|
"@typescript-eslint/camelcase": "off",
|
||||||
|
"@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }],
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# GF TypeScript Runtime
|
||||||
|
|
||||||
|
`gflib.ts` is a TypeScript implementation of the GF runtime.
|
||||||
|
It is ported from an older JavaScript implementation [`gflib.js`](../javascript/gflib.js),
|
||||||
|
with some improvements.
|
||||||
|
|
||||||
|
Importantly, all **future** updates will only be made to this TypeScript version.
|
||||||
|
|
||||||
|
## Applicability
|
||||||
|
|
||||||
|
This runtime allows you use GF in pure JavaScript, and thus have GF-powered apps without the need for a server backend.
|
||||||
|
However, it has not been actively maintained as the other runtimes have been.
|
||||||
|
So its features are limited and it is not efficient, making it really only useful for smaller grammars.
|
||||||
|
|
||||||
|
## Using
|
||||||
|
|
||||||
|
`gflib.ts` can be transpiled to JavaScript by running `tsc` in this folder (of course you need TypeScript installed).
|
||||||
|
It has no module dependencies.
|
||||||
|
You can then include the generated `js/gflib.js` file in your application as usual.
|
||||||
|
|
||||||
|
_This generated JavaScript version is also included under version control,
|
||||||
|
to make it easy for someone to use without having to install TypeScript._
|
||||||
|
|
||||||
|
Your GF grammar should be compiled with: `gf --make --output-format=js`
|
||||||
|
|
||||||
|
For an example of a working web application using the JavaScript runtime, see `../javascript`.
|
||||||
|
|
||||||
|
## What happened to `gflib.d.ts`?
|
||||||
|
|
||||||
|
There was once a file here called `gflib.d.ts`, which contained TypeScript type definitions for the **old** `gflib.js`.
|
||||||
|
Since the runtime is now ported to TypeScript, those type definitions are no longer necessary (plus they contained many errors).
|
||||||
Vendored
-337
@@ -1,337 +0,0 @@
|
|||||||
/**
|
|
||||||
* gflib.dt.s
|
|
||||||
*
|
|
||||||
* by John J. Camilleri
|
|
||||||
*
|
|
||||||
* TypeScript type definitions for the "original" JS GF runtime (GF:src/runtime/javascript/gflib.js)
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Note: the String prototype is extended with:
|
|
||||||
// String.prototype.tag = "";
|
|
||||||
// String.prototype.setTag = function (tag) { this.tag = tag; };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A GF grammar is one abstract and multiple concretes
|
|
||||||
*/
|
|
||||||
declare class GFGrammar {
|
|
||||||
abstract: GFAbstract
|
|
||||||
concretes: {[key: string]: GFConcrete}
|
|
||||||
|
|
||||||
constructor(abstract: GFAbstract, concretes: {[key: string]: GFConcrete})
|
|
||||||
|
|
||||||
translate(
|
|
||||||
input: string,
|
|
||||||
fromLang: string,
|
|
||||||
toLang: string
|
|
||||||
): {[key: string]: {[key: string]: string}}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract Syntax Tree
|
|
||||||
*/
|
|
||||||
declare class Fun {
|
|
||||||
name: string
|
|
||||||
args: Fun[]
|
|
||||||
|
|
||||||
constructor(name: string, ...args: Fun[])
|
|
||||||
|
|
||||||
print(): string
|
|
||||||
show(): string
|
|
||||||
getArg(i: number): Fun
|
|
||||||
setArg(i: number, c: Fun): void
|
|
||||||
isMeta(): boolean
|
|
||||||
isComplete(): boolean
|
|
||||||
isLiteral(): boolean
|
|
||||||
isString(): boolean
|
|
||||||
isInt(): boolean
|
|
||||||
isFloat(): boolean
|
|
||||||
isEqual(obj: any): boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract syntax
|
|
||||||
*/
|
|
||||||
declare class GFAbstract {
|
|
||||||
startcat: string
|
|
||||||
types: {[key: string]: Type} // key is function name
|
|
||||||
|
|
||||||
constructor(startcat: string, types: {[key: string]: Type})
|
|
||||||
|
|
||||||
addType(fun: string, args: string[], cat: string): void
|
|
||||||
getArgs(fun: string): string[]
|
|
||||||
getCat(fun: string): string
|
|
||||||
annotate(tree: Fun, type: string): Fun
|
|
||||||
handleLiterals(tree: Fun, type: Type): Fun
|
|
||||||
copyTree(x: Fun): Fun
|
|
||||||
parseTree(str: string, type: string): Fun
|
|
||||||
parseTree_(tokens: string[], prec: number): Fun
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Type
|
|
||||||
*/
|
|
||||||
declare class Type {
|
|
||||||
args: string[]
|
|
||||||
cat: string
|
|
||||||
|
|
||||||
constructor(args: string[], cat: string)
|
|
||||||
}
|
|
||||||
|
|
||||||
type ApplyOrCoerce = Apply | Coerce
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Concrete syntax
|
|
||||||
*/
|
|
||||||
declare class GFConcrete {
|
|
||||||
flags: {[key: string]: string}
|
|
||||||
productions: {[key: number]: ApplyOrCoerce[]}
|
|
||||||
functions: CncFun[]
|
|
||||||
sequences: Array<Array<Sym>>
|
|
||||||
startCats: {[key: string]: {s: number, e: number}}
|
|
||||||
totalFIds: number
|
|
||||||
pproductions: {[key: number]: ApplyOrCoerce[]}
|
|
||||||
lproductions: {[key: string]: {fid: FId, fun: CncFun}}
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
flags: {[key: string]: string},
|
|
||||||
productions: {[key: number]: ApplyOrCoerce[]},
|
|
||||||
functions: CncFun[],
|
|
||||||
sequences: Array<Array<Sym>>,
|
|
||||||
startCats: {[key: string]: {s: number, e: number}},
|
|
||||||
totalFIds: number
|
|
||||||
)
|
|
||||||
|
|
||||||
linearizeSyms(tree: Fun, tag: string): Array<{fid: FId, table: any}>
|
|
||||||
syms2toks(syms: Sym[]): string[]
|
|
||||||
linearizeAll(tree: Fun): string[]
|
|
||||||
linearize(tree: Fun): string
|
|
||||||
tagAndLinearize(tree: Fun): string[]
|
|
||||||
unlex(ts: string): string
|
|
||||||
tagIt(obj: any, tag: string): any
|
|
||||||
// showRules(): string // Uncaught TypeError: Cannot read property 'length' of undefined at gflib.js:451
|
|
||||||
tokenize(string: string): string[]
|
|
||||||
parseString(string: string, cat: string): Fun[]
|
|
||||||
complete(
|
|
||||||
input: string,
|
|
||||||
cat: string
|
|
||||||
): {consumed: string[], suggestions: string[]}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function ID
|
|
||||||
*/
|
|
||||||
type FId = number
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply
|
|
||||||
*/
|
|
||||||
declare class Apply {
|
|
||||||
id: string
|
|
||||||
fun: FId
|
|
||||||
args: PArg[]
|
|
||||||
|
|
||||||
constructor(fun: FId, args: PArg[])
|
|
||||||
|
|
||||||
show(cat: string): string
|
|
||||||
isEqual(obj: any): boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PArg
|
|
||||||
*/
|
|
||||||
declare class PArg {
|
|
||||||
fid: FId
|
|
||||||
hypos: any[]
|
|
||||||
|
|
||||||
constructor(fid: FId, ...hypos: any[])
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Coerce
|
|
||||||
*/
|
|
||||||
declare class Coerce {
|
|
||||||
id: string
|
|
||||||
arg: FId
|
|
||||||
|
|
||||||
constructor(arg: FId)
|
|
||||||
|
|
||||||
show(cat: string): string
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Const
|
|
||||||
*/
|
|
||||||
declare class Const {
|
|
||||||
id: string
|
|
||||||
lit: Fun
|
|
||||||
toks: any[]
|
|
||||||
|
|
||||||
constructor(lit: Fun, toks: any[])
|
|
||||||
|
|
||||||
show(cat: string): string
|
|
||||||
isEqual(obj: any): boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* CncFun
|
|
||||||
*/
|
|
||||||
declare class CncFun {
|
|
||||||
name: string
|
|
||||||
lins: FId[]
|
|
||||||
|
|
||||||
constructor(name: string, lins: FId[])
|
|
||||||
}
|
|
||||||
|
|
||||||
type Sym = SymCat | SymKS | SymKP | SymLit
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SymCat
|
|
||||||
*/
|
|
||||||
declare class SymCat {
|
|
||||||
id: string
|
|
||||||
i: number
|
|
||||||
label: number
|
|
||||||
|
|
||||||
constructor(i: number, label: number)
|
|
||||||
|
|
||||||
getId(): string
|
|
||||||
getArgNum(): number
|
|
||||||
show(): string
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SymKS
|
|
||||||
*/
|
|
||||||
declare class SymKS {
|
|
||||||
id: string
|
|
||||||
tokens: string[]
|
|
||||||
|
|
||||||
constructor(...tokens: string[])
|
|
||||||
|
|
||||||
getId(): string
|
|
||||||
show(): string
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SymKP
|
|
||||||
*/
|
|
||||||
declare class SymKP {
|
|
||||||
id: string
|
|
||||||
tokens: string[]
|
|
||||||
alts: Alt[]
|
|
||||||
|
|
||||||
constructor(tokens: string[], alts: Alt[])
|
|
||||||
|
|
||||||
getId(): string
|
|
||||||
show(): string
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Alt
|
|
||||||
*/
|
|
||||||
declare class Alt {
|
|
||||||
tokens: string[]
|
|
||||||
prefixes: string[]
|
|
||||||
|
|
||||||
constructor(tokens: string[], prefixes: string[])
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SymLit
|
|
||||||
*/
|
|
||||||
declare class SymLit {
|
|
||||||
id: string
|
|
||||||
i: number
|
|
||||||
label: number
|
|
||||||
|
|
||||||
constructor(i: number, label: number)
|
|
||||||
|
|
||||||
getId(): string
|
|
||||||
show(): string
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Trie
|
|
||||||
*/
|
|
||||||
declare class Trie {
|
|
||||||
value: any
|
|
||||||
items: Trie[]
|
|
||||||
|
|
||||||
insertChain(keys, obj): void
|
|
||||||
insertChain1(keys, obj): void
|
|
||||||
lookup(key, obj): any
|
|
||||||
isEmpty(): boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ParseState
|
|
||||||
*/
|
|
||||||
declare class ParseState {
|
|
||||||
concrete: GFConcrete
|
|
||||||
startCat: string
|
|
||||||
items: Trie
|
|
||||||
chart: Chart
|
|
||||||
|
|
||||||
constructor(concrete: GFConcrete, startCat: string)
|
|
||||||
|
|
||||||
next(token: string): boolean
|
|
||||||
complete(correntToken: string): Trie
|
|
||||||
extractTrees(): any[]
|
|
||||||
process(
|
|
||||||
agenda,
|
|
||||||
literalCallback: (fid: FId) => any,
|
|
||||||
tokenCallback: (tokens: string[], item: any) => any
|
|
||||||
): void
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Chart
|
|
||||||
*/
|
|
||||||
declare class Chart {
|
|
||||||
active: any
|
|
||||||
actives: {[key: number]: any}
|
|
||||||
passive: any
|
|
||||||
forest: {[key: number]: ApplyOrCoerce[]}
|
|
||||||
nextId: number
|
|
||||||
offset: number
|
|
||||||
|
|
||||||
constructor(concrete: GFConcrete)
|
|
||||||
|
|
||||||
lookupAC(fid: FId,label)
|
|
||||||
lookupACo(offset, fid: FId, label)
|
|
||||||
|
|
||||||
labelsAC(fid: FId)
|
|
||||||
insertAC(fid: FId, label, items): void
|
|
||||||
|
|
||||||
lookupPC(fid: FId, label, offset)
|
|
||||||
insertPC(fid1: FId, label, offset, fid2: FId): void
|
|
||||||
shift(): void
|
|
||||||
expandForest(fid: FId): any[]
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ActiveItem
|
|
||||||
*/
|
|
||||||
declare class ActiveItem {
|
|
||||||
offset: number
|
|
||||||
dot: number
|
|
||||||
fun: CncFun
|
|
||||||
seq: Array<Sym>
|
|
||||||
args: PArg[]
|
|
||||||
fid: FId
|
|
||||||
lbl: number
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
offset: number,
|
|
||||||
dot: number,
|
|
||||||
fun: CncFun,
|
|
||||||
seq: Array<Sym>,
|
|
||||||
args: PArg[],
|
|
||||||
fid: FId,
|
|
||||||
lbl: number
|
|
||||||
)
|
|
||||||
|
|
||||||
isEqual(obj: any): boolean
|
|
||||||
shiftOverArg(i: number, fid: FId): ActiveItem
|
|
||||||
shiftOverTokn(): ActiveItem
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"module": "none",
|
||||||
|
"target": "es3",
|
||||||
|
"strict": true,
|
||||||
|
"noImplicitAny": true,
|
||||||
|
"removeComments": true,
|
||||||
|
"outDir": "js",
|
||||||
|
"sourceMap": true
|
||||||
|
},
|
||||||
|
"compileOnSave": true
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user