434 lines
11 KiB
C#
434 lines
11 KiB
C#
using System;
|
|
using System.Collections;
|
|
|
|
namespace System.Text.RegularExpressions
|
|
{
|
|
// Token: 0x020002C8 RID: 712
|
|
internal class PatternCompiler : ICompiler
|
|
{
|
|
// Token: 0x060019D9 RID: 6617 RVA: 0x0005C534 File Offset: 0x0005A734
|
|
public PatternCompiler()
|
|
{
|
|
this.pgm = new ArrayList();
|
|
}
|
|
|
|
// Token: 0x060019DA RID: 6618 RVA: 0x0005C548 File Offset: 0x0005A748
|
|
public static ushort EncodeOp(OpCode op, OpFlags flags)
|
|
{
|
|
return (ushort)(op | (OpCode)(flags & (OpFlags)65280));
|
|
}
|
|
|
|
// Token: 0x060019DB RID: 6619 RVA: 0x0005C554 File Offset: 0x0005A754
|
|
public static void DecodeOp(ushort word, out OpCode op, out OpFlags flags)
|
|
{
|
|
op = (OpCode)(word & 255);
|
|
flags = (OpFlags)(word & 65280);
|
|
}
|
|
|
|
// Token: 0x060019DC RID: 6620 RVA: 0x0005C56C File Offset: 0x0005A76C
|
|
public void Reset()
|
|
{
|
|
this.pgm.Clear();
|
|
}
|
|
|
|
// Token: 0x060019DD RID: 6621 RVA: 0x0005C57C File Offset: 0x0005A77C
|
|
public IMachineFactory GetMachineFactory()
|
|
{
|
|
ushort[] array = new ushort[this.pgm.Count];
|
|
this.pgm.CopyTo(array);
|
|
return new InterpreterFactory(array);
|
|
}
|
|
|
|
// Token: 0x060019DE RID: 6622 RVA: 0x0005C5AC File Offset: 0x0005A7AC
|
|
public void EmitFalse()
|
|
{
|
|
this.Emit(OpCode.False);
|
|
}
|
|
|
|
// Token: 0x060019DF RID: 6623 RVA: 0x0005C5B8 File Offset: 0x0005A7B8
|
|
public void EmitTrue()
|
|
{
|
|
this.Emit(OpCode.True);
|
|
}
|
|
|
|
// Token: 0x060019E0 RID: 6624 RVA: 0x0005C5C4 File Offset: 0x0005A7C4
|
|
private void EmitCount(int count)
|
|
{
|
|
this.Emit((ushort)(count & 65535));
|
|
this.Emit((ushort)((uint)count >> 16));
|
|
}
|
|
|
|
// Token: 0x060019E1 RID: 6625 RVA: 0x0005C5EC File Offset: 0x0005A7EC
|
|
public void EmitCharacter(char c, bool negate, bool ignore, bool reverse)
|
|
{
|
|
this.Emit(OpCode.Character, PatternCompiler.MakeFlags(negate, ignore, reverse, false));
|
|
if (ignore)
|
|
{
|
|
c = char.ToLower(c);
|
|
}
|
|
this.Emit((ushort)c);
|
|
}
|
|
|
|
// Token: 0x060019E2 RID: 6626 RVA: 0x0005C620 File Offset: 0x0005A820
|
|
public void EmitCategory(Category cat, bool negate, bool reverse)
|
|
{
|
|
this.Emit(OpCode.Category, PatternCompiler.MakeFlags(negate, false, reverse, false));
|
|
this.Emit((ushort)cat);
|
|
}
|
|
|
|
// Token: 0x060019E3 RID: 6627 RVA: 0x0005C63C File Offset: 0x0005A83C
|
|
public void EmitNotCategory(Category cat, bool negate, bool reverse)
|
|
{
|
|
this.Emit(OpCode.NotCategory, PatternCompiler.MakeFlags(negate, false, reverse, false));
|
|
this.Emit((ushort)cat);
|
|
}
|
|
|
|
// Token: 0x060019E4 RID: 6628 RVA: 0x0005C658 File Offset: 0x0005A858
|
|
public void EmitRange(char lo, char hi, bool negate, bool ignore, bool reverse)
|
|
{
|
|
this.Emit(OpCode.Range, PatternCompiler.MakeFlags(negate, ignore, reverse, false));
|
|
this.Emit((ushort)lo);
|
|
this.Emit((ushort)hi);
|
|
}
|
|
|
|
// Token: 0x060019E5 RID: 6629 RVA: 0x0005C688 File Offset: 0x0005A888
|
|
public void EmitSet(char lo, BitArray set, bool negate, bool ignore, bool reverse)
|
|
{
|
|
this.Emit(OpCode.Set, PatternCompiler.MakeFlags(negate, ignore, reverse, false));
|
|
this.Emit((ushort)lo);
|
|
int num = set.Length + 15 >> 4;
|
|
this.Emit((ushort)num);
|
|
int num2 = 0;
|
|
while (num-- != 0)
|
|
{
|
|
ushort num3 = 0;
|
|
for (int i = 0; i < 16; i++)
|
|
{
|
|
if (num2 >= set.Length)
|
|
{
|
|
break;
|
|
}
|
|
if (set[num2++])
|
|
{
|
|
num3 |= (ushort)(1 << i);
|
|
}
|
|
}
|
|
this.Emit(num3);
|
|
}
|
|
}
|
|
|
|
// Token: 0x060019E6 RID: 6630 RVA: 0x0005C71C File Offset: 0x0005A91C
|
|
public void EmitString(string str, bool ignore, bool reverse)
|
|
{
|
|
this.Emit(OpCode.String, PatternCompiler.MakeFlags(false, ignore, reverse, false));
|
|
int length = str.Length;
|
|
this.Emit((ushort)length);
|
|
if (ignore)
|
|
{
|
|
str = str.ToLower();
|
|
}
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
this.Emit((ushort)str[i]);
|
|
}
|
|
}
|
|
|
|
// Token: 0x060019E7 RID: 6631 RVA: 0x0005C778 File Offset: 0x0005A978
|
|
public void EmitPosition(Position pos)
|
|
{
|
|
this.Emit(OpCode.Position, OpFlags.None);
|
|
this.Emit((ushort)pos);
|
|
}
|
|
|
|
// Token: 0x060019E8 RID: 6632 RVA: 0x0005C78C File Offset: 0x0005A98C
|
|
public void EmitOpen(int gid)
|
|
{
|
|
this.Emit(OpCode.Open);
|
|
this.Emit((ushort)gid);
|
|
}
|
|
|
|
// Token: 0x060019E9 RID: 6633 RVA: 0x0005C7A0 File Offset: 0x0005A9A0
|
|
public void EmitClose(int gid)
|
|
{
|
|
this.Emit(OpCode.Close);
|
|
this.Emit((ushort)gid);
|
|
}
|
|
|
|
// Token: 0x060019EA RID: 6634 RVA: 0x0005C7B4 File Offset: 0x0005A9B4
|
|
public void EmitBalanceStart(int gid, int balance, bool capture, LinkRef tail)
|
|
{
|
|
this.BeginLink(tail);
|
|
this.Emit(OpCode.BalanceStart);
|
|
this.Emit((ushort)gid);
|
|
this.Emit((ushort)balance);
|
|
this.Emit((!capture) ? 0 : 1);
|
|
this.EmitLink(tail);
|
|
}
|
|
|
|
// Token: 0x060019EB RID: 6635 RVA: 0x0005C800 File Offset: 0x0005AA00
|
|
public void EmitBalance()
|
|
{
|
|
this.Emit(OpCode.Balance);
|
|
}
|
|
|
|
// Token: 0x060019EC RID: 6636 RVA: 0x0005C80C File Offset: 0x0005AA0C
|
|
public void EmitReference(int gid, bool ignore, bool reverse)
|
|
{
|
|
this.Emit(OpCode.Reference, PatternCompiler.MakeFlags(false, ignore, reverse, false));
|
|
this.Emit((ushort)gid);
|
|
}
|
|
|
|
// Token: 0x060019ED RID: 6637 RVA: 0x0005C828 File Offset: 0x0005AA28
|
|
public void EmitIfDefined(int gid, LinkRef tail)
|
|
{
|
|
this.BeginLink(tail);
|
|
this.Emit(OpCode.IfDefined);
|
|
this.EmitLink(tail);
|
|
this.Emit((ushort)gid);
|
|
}
|
|
|
|
// Token: 0x060019EE RID: 6638 RVA: 0x0005C854 File Offset: 0x0005AA54
|
|
public void EmitSub(LinkRef tail)
|
|
{
|
|
this.BeginLink(tail);
|
|
this.Emit(OpCode.Sub);
|
|
this.EmitLink(tail);
|
|
}
|
|
|
|
// Token: 0x060019EF RID: 6639 RVA: 0x0005C86C File Offset: 0x0005AA6C
|
|
public void EmitTest(LinkRef yes, LinkRef tail)
|
|
{
|
|
this.BeginLink(yes);
|
|
this.BeginLink(tail);
|
|
this.Emit(OpCode.Test);
|
|
this.EmitLink(yes);
|
|
this.EmitLink(tail);
|
|
}
|
|
|
|
// Token: 0x060019F0 RID: 6640 RVA: 0x0005C8A0 File Offset: 0x0005AAA0
|
|
public void EmitBranch(LinkRef next)
|
|
{
|
|
this.BeginLink(next);
|
|
this.Emit(OpCode.Branch, OpFlags.None);
|
|
this.EmitLink(next);
|
|
}
|
|
|
|
// Token: 0x060019F1 RID: 6641 RVA: 0x0005C8BC File Offset: 0x0005AABC
|
|
public void EmitJump(LinkRef target)
|
|
{
|
|
this.BeginLink(target);
|
|
this.Emit(OpCode.Jump, OpFlags.None);
|
|
this.EmitLink(target);
|
|
}
|
|
|
|
// Token: 0x060019F2 RID: 6642 RVA: 0x0005C8D8 File Offset: 0x0005AAD8
|
|
public void EmitRepeat(int min, int max, bool lazy, LinkRef until)
|
|
{
|
|
this.BeginLink(until);
|
|
this.Emit(OpCode.Repeat, PatternCompiler.MakeFlags(false, false, false, lazy));
|
|
this.EmitLink(until);
|
|
this.EmitCount(min);
|
|
this.EmitCount(max);
|
|
}
|
|
|
|
// Token: 0x060019F3 RID: 6643 RVA: 0x0005C914 File Offset: 0x0005AB14
|
|
public void EmitUntil(LinkRef repeat)
|
|
{
|
|
this.ResolveLink(repeat);
|
|
this.Emit(OpCode.Until);
|
|
}
|
|
|
|
// Token: 0x060019F4 RID: 6644 RVA: 0x0005C928 File Offset: 0x0005AB28
|
|
public void EmitFastRepeat(int min, int max, bool lazy, LinkRef tail)
|
|
{
|
|
this.BeginLink(tail);
|
|
this.Emit(OpCode.FastRepeat, PatternCompiler.MakeFlags(false, false, false, lazy));
|
|
this.EmitLink(tail);
|
|
this.EmitCount(min);
|
|
this.EmitCount(max);
|
|
}
|
|
|
|
// Token: 0x060019F5 RID: 6645 RVA: 0x0005C964 File Offset: 0x0005AB64
|
|
public void EmitIn(LinkRef tail)
|
|
{
|
|
this.BeginLink(tail);
|
|
this.Emit(OpCode.In);
|
|
this.EmitLink(tail);
|
|
}
|
|
|
|
// Token: 0x060019F6 RID: 6646 RVA: 0x0005C97C File Offset: 0x0005AB7C
|
|
public void EmitAnchor(bool reverse, int offset, LinkRef tail)
|
|
{
|
|
this.BeginLink(tail);
|
|
this.Emit(OpCode.Anchor, PatternCompiler.MakeFlags(false, false, reverse, false));
|
|
this.EmitLink(tail);
|
|
this.Emit((ushort)offset);
|
|
}
|
|
|
|
// Token: 0x060019F7 RID: 6647 RVA: 0x0005C9B0 File Offset: 0x0005ABB0
|
|
public void EmitInfo(int count, int min, int max)
|
|
{
|
|
this.Emit(OpCode.Info);
|
|
this.EmitCount(count);
|
|
this.EmitCount(min);
|
|
this.EmitCount(max);
|
|
}
|
|
|
|
// Token: 0x060019F8 RID: 6648 RVA: 0x0005C9DC File Offset: 0x0005ABDC
|
|
public LinkRef NewLink()
|
|
{
|
|
return new PatternCompiler.PatternLinkStack();
|
|
}
|
|
|
|
// Token: 0x060019F9 RID: 6649 RVA: 0x0005C9E4 File Offset: 0x0005ABE4
|
|
public void ResolveLink(LinkRef lref)
|
|
{
|
|
PatternCompiler.PatternLinkStack patternLinkStack = (PatternCompiler.PatternLinkStack)lref;
|
|
while (patternLinkStack.Pop())
|
|
{
|
|
this.pgm[patternLinkStack.OffsetAddress] = (ushort)patternLinkStack.GetOffset(this.CurrentAddress);
|
|
}
|
|
}
|
|
|
|
// Token: 0x060019FA RID: 6650 RVA: 0x0005CA2C File Offset: 0x0005AC2C
|
|
public void EmitBranchEnd()
|
|
{
|
|
}
|
|
|
|
// Token: 0x060019FB RID: 6651 RVA: 0x0005CA30 File Offset: 0x0005AC30
|
|
public void EmitAlternationEnd()
|
|
{
|
|
}
|
|
|
|
// Token: 0x060019FC RID: 6652 RVA: 0x0005CA34 File Offset: 0x0005AC34
|
|
private static OpFlags MakeFlags(bool negate, bool ignore, bool reverse, bool lazy)
|
|
{
|
|
OpFlags opFlags = OpFlags.None;
|
|
if (negate)
|
|
{
|
|
opFlags |= OpFlags.Negate;
|
|
}
|
|
if (ignore)
|
|
{
|
|
opFlags |= OpFlags.IgnoreCase;
|
|
}
|
|
if (reverse)
|
|
{
|
|
opFlags |= OpFlags.RightToLeft;
|
|
}
|
|
if (lazy)
|
|
{
|
|
opFlags |= OpFlags.Lazy;
|
|
}
|
|
return opFlags;
|
|
}
|
|
|
|
// Token: 0x060019FD RID: 6653 RVA: 0x0005CA80 File Offset: 0x0005AC80
|
|
private void Emit(OpCode op)
|
|
{
|
|
this.Emit(op, OpFlags.None);
|
|
}
|
|
|
|
// Token: 0x060019FE RID: 6654 RVA: 0x0005CA8C File Offset: 0x0005AC8C
|
|
private void Emit(OpCode op, OpFlags flags)
|
|
{
|
|
this.Emit(PatternCompiler.EncodeOp(op, flags));
|
|
}
|
|
|
|
// Token: 0x060019FF RID: 6655 RVA: 0x0005CA9C File Offset: 0x0005AC9C
|
|
private void Emit(ushort word)
|
|
{
|
|
this.pgm.Add(word);
|
|
}
|
|
|
|
// Token: 0x17000805 RID: 2053
|
|
// (get) Token: 0x06001A00 RID: 6656 RVA: 0x0005CAB0 File Offset: 0x0005ACB0
|
|
private int CurrentAddress
|
|
{
|
|
get
|
|
{
|
|
return this.pgm.Count;
|
|
}
|
|
}
|
|
|
|
// Token: 0x06001A01 RID: 6657 RVA: 0x0005CAC0 File Offset: 0x0005ACC0
|
|
private void BeginLink(LinkRef lref)
|
|
{
|
|
PatternCompiler.PatternLinkStack patternLinkStack = (PatternCompiler.PatternLinkStack)lref;
|
|
patternLinkStack.BaseAddress = this.CurrentAddress;
|
|
}
|
|
|
|
// Token: 0x06001A02 RID: 6658 RVA: 0x0005CAE0 File Offset: 0x0005ACE0
|
|
private void EmitLink(LinkRef lref)
|
|
{
|
|
PatternCompiler.PatternLinkStack patternLinkStack = (PatternCompiler.PatternLinkStack)lref;
|
|
patternLinkStack.OffsetAddress = this.CurrentAddress;
|
|
this.Emit(0);
|
|
patternLinkStack.Push();
|
|
}
|
|
|
|
// Token: 0x04001574 RID: 5492
|
|
private ArrayList pgm;
|
|
|
|
// Token: 0x020002C9 RID: 713
|
|
private class PatternLinkStack : LinkStack
|
|
{
|
|
// Token: 0x17000806 RID: 2054
|
|
// (set) Token: 0x06001A04 RID: 6660 RVA: 0x0005CB18 File Offset: 0x0005AD18
|
|
public int BaseAddress
|
|
{
|
|
set
|
|
{
|
|
this.link.base_addr = value;
|
|
}
|
|
}
|
|
|
|
// Token: 0x17000807 RID: 2055
|
|
// (get) Token: 0x06001A05 RID: 6661 RVA: 0x0005CB28 File Offset: 0x0005AD28
|
|
// (set) Token: 0x06001A06 RID: 6662 RVA: 0x0005CB38 File Offset: 0x0005AD38
|
|
public int OffsetAddress
|
|
{
|
|
get
|
|
{
|
|
return this.link.offset_addr;
|
|
}
|
|
set
|
|
{
|
|
this.link.offset_addr = value;
|
|
}
|
|
}
|
|
|
|
// Token: 0x06001A07 RID: 6663 RVA: 0x0005CB48 File Offset: 0x0005AD48
|
|
public int GetOffset(int target_addr)
|
|
{
|
|
return target_addr - this.link.base_addr;
|
|
}
|
|
|
|
// Token: 0x06001A08 RID: 6664 RVA: 0x0005CB58 File Offset: 0x0005AD58
|
|
protected override object GetCurrent()
|
|
{
|
|
return this.link;
|
|
}
|
|
|
|
// Token: 0x06001A09 RID: 6665 RVA: 0x0005CB68 File Offset: 0x0005AD68
|
|
protected override void SetCurrent(object l)
|
|
{
|
|
this.link = (PatternCompiler.PatternLinkStack.Link)l;
|
|
}
|
|
|
|
// Token: 0x04001575 RID: 5493
|
|
private PatternCompiler.PatternLinkStack.Link link;
|
|
|
|
// Token: 0x020002CA RID: 714
|
|
private struct Link
|
|
{
|
|
// Token: 0x04001576 RID: 5494
|
|
public int base_addr;
|
|
|
|
// Token: 0x04001577 RID: 5495
|
|
public int offset_addr;
|
|
}
|
|
}
|
|
}
|
|
}
|