mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-30 14:52:51 -06:00
Embedded grammars in C#
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Dynamic;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
@@ -154,5 +155,57 @@ namespace PGFSharp
|
|||||||
Native.MapIter(f, _ptr, (k, v) => c.Add(k));
|
Native.MapIter(f, _ptr, (k, v) => c.Add(k));
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public dynamic Embed() {
|
||||||
|
return new GrammarEmbedding(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class GrammarEmbedding : DynamicObject {
|
||||||
|
private PGF gr;
|
||||||
|
|
||||||
|
public GrammarEmbedding(PGF gr) {
|
||||||
|
this.gr = gr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool TryGetMember(GetMemberBinder binder, out object result)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
|
||||||
|
using (var str = new Native.NativeString(binder.Name))
|
||||||
|
{
|
||||||
|
var typePtr = Native.pgf_function_type(gr._ptr, str.Ptr);
|
||||||
|
if (typePtr == IntPtr.Zero)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = new ApplicationExpr(binder.Name, new Expr[0]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) {
|
||||||
|
result = null;
|
||||||
|
|
||||||
|
uint n_hypos = 0;
|
||||||
|
using (var str = new Native.NativeString(binder.Name))
|
||||||
|
{
|
||||||
|
var typePtr = Native.pgf_function_type(gr._ptr, str.Ptr);
|
||||||
|
if (typePtr == IntPtr.Zero)
|
||||||
|
return false;
|
||||||
|
n_hypos = NativeGU.SeqLength(Marshal.PtrToStructure<Type.PgfType>(typePtr).hypos);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.Length != n_hypos)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Expr[] exprs = new Expr[args.Length];
|
||||||
|
for (var i = 0; i < args.Length; i++) {
|
||||||
|
exprs[i] = args[i] as Expr;
|
||||||
|
if (exprs[i] == null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
result = new ApplicationExpr(binder.Name, exprs);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ namespace PGFSharp
|
|||||||
}
|
}
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
private struct PgfType
|
internal struct PgfType
|
||||||
{
|
{
|
||||||
public IntPtr hypos; // GuSeq of PgfHypo
|
public IntPtr hypos; // GuSeq of PgfHypo
|
||||||
public IntPtr cid;
|
public IntPtr cid;
|
||||||
|
|||||||
Reference in New Issue
Block a user