-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIResolver.cs
77 lines (64 loc) · 2.04 KB
/
IResolver.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
using System;
namespace CriteriaExpression
{
public interface IResolver
{
Token HandleVariable(string lexeme);
Token HandleFunction(string lexeme, Token[] args);
}
public delegate Token ResolveFunc(TokenType type, string lexeme, Token[] args);
public abstract class Resolver : IResolver
{
static private Resolver DefaultResolverInstance = null;
static public Resolver Default
{
get
{
System.Threading.Interlocked.CompareExchange<Resolver>(
ref DefaultResolverInstance,
new _DefaultResolver(),
null);
return DefaultResolverInstance;
}
}
public abstract Token HandleVariable(string lexeme);
public abstract Token HandleFunction(string lexeme, Token[] args);
static internal Resolver CreateResolver(ResolveFunc func)
{
return new ResolveFuncWrapper(func);
}
internal class _DefaultResolver : Resolver, IResolver
{
internal _DefaultResolver()
{
// do nothing ...
}
public override Token HandleVariable(string lexeme)
{
return Token.Null;
}
public override Token HandleFunction(string lexeme, Token[] args)
{
return Token.Null;
}
}
}
class ResolveFuncWrapper : Resolver, IResolver
{
private ResolveFunc _resolve;
internal ResolveFuncWrapper(ResolveFunc func)
{
if (func == null)
throw new ArgumentNullException("func");
_resolve = func;
}
public override Token HandleVariable(string lexeme)
{
return _resolve.Invoke(TokenType.Variable, lexeme, null);
}
public override Token HandleFunction(string lexeme, Token[] args)
{
return _resolve.Invoke(TokenType.Function, lexeme, args);
}
}
}