55
|
1 using Implab;
|
|
2 using System;
|
|
3 using System.Collections.Generic;
|
|
4 using System.Globalization;
|
|
5 using System.Linq;
|
|
6 using System.Text;
|
|
7 using System.Threading.Tasks;
|
|
8
|
|
9 namespace Implab.Parsing {
|
|
10 public abstract class Token {
|
|
11 public abstract void Accept(IVisitor visitor);
|
|
12
|
|
13 public Token Extend() {
|
|
14 return new CatToken(this, new EndToken());
|
|
15 }
|
|
16
|
|
17 public Token Tag<T>(T tag) where T : IConvertible {
|
|
18 return new CatToken(this, new EndToken(tag.ToInt32(CultureInfo.InvariantCulture)));
|
|
19 }
|
|
20
|
|
21 public Token Cat(Token right) {
|
|
22 return new CatToken(this, right);
|
|
23 }
|
|
24
|
|
25 public Token Or(Token right) {
|
|
26 return new AltToken(this, right);
|
|
27 }
|
|
28
|
|
29 public Token Optional() {
|
|
30 return Or(new EmptyToken());
|
|
31 }
|
|
32
|
|
33 public Token EClosure() {
|
|
34 return new StarToken(this);
|
|
35 }
|
|
36
|
|
37 public Token Closure() {
|
|
38 return new CatToken(this, new StarToken(this));
|
|
39 }
|
|
40
|
|
41 public Token Repeat(int count) {
|
|
42 Token token = null;
|
|
43
|
|
44 for (int i = 0; i < count; i++)
|
|
45 token = token != null ? token.Cat(this) : this;
|
|
46 return token ?? new EmptyToken();
|
|
47 }
|
|
48
|
|
49 public Token Repeat(int min, int max) {
|
|
50 if (min > max || min < 1)
|
|
51 throw new ArgumentOutOfRangeException();
|
|
52 var token = Repeat(min);
|
|
53
|
|
54 for (int i = min; i < max; i++)
|
|
55 token = token.Cat( this.Optional() );
|
|
56 return token;
|
|
57 }
|
|
58
|
|
59 public static Token New<T>(params T[] set) where T : struct, IConvertible {
|
|
60 Safe.ArgumentNotNull(set, "set");
|
|
61 Token token = null;
|
|
62 foreach(var c in set.Distinct())
|
|
63 token = token == null ? new SymbolToken(c.ToInt32(CultureInfo.InvariantCulture)) : token.Or(new SymbolToken(c.ToInt32(CultureInfo.InvariantCulture)));
|
|
64 return token;
|
|
65 }
|
|
66 }
|
|
67 }
|