Skip to content

Commit 5f83345

Browse files
committed
Initial version
1 parent 88f0f75 commit 5f83345

15 files changed

+861
-0
lines changed

.gitignore

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
*.xproj.user
2+
.vs/*
3+
.vscode/*
4+
bin/*
5+
obj/*
6+
*.sln
7+
*.log
8+
*.lock.json

JQueryDataTables/UriParser.cs

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using Microsoft.AspNetCore.Http;
2+
using SqlServerRestApi.SQL;
3+
using System;
4+
using System.Collections;
5+
6+
namespace SqlServerRestApi.JQueryDataTable
7+
{
8+
public class UriParser
9+
{
10+
public QuerySpec Parse (TableSpec tabSpec, HttpRequest Request)
11+
{
12+
var spec = new QuerySpec();
13+
spec.skip = Convert.ToInt32(Request.Query["start"]);
14+
spec.top = Convert.ToInt32(Request.Query["length"]);
15+
spec.select = null;//JQuery datatables don't provide column list.
16+
ParseSearch(Request, spec);
17+
ParseOrderBy(tabSpec, Request, spec);
18+
tabSpec.Validate(spec, true);
19+
return spec;
20+
}
21+
22+
private static void ParseSearch(HttpRequest Request, QuerySpec spec)
23+
{
24+
spec.keyword = Request.Query[$"[search][value]"].ToString();
25+
spec.columnFilter = new Hashtable();
26+
int i = 0;
27+
28+
while (Request.Query[$"columns[{i}][searchable]"].Count != 0)
29+
{
30+
if (Request.Query[$"columns[{i}][searchable]"][0] == "true")
31+
{
32+
spec.columnFilter.Add(
33+
Request.Query[$"columns[{i}][data]"][0].ToString(),
34+
Request.Query[$"columns[{i}][search][value]"][0].ToString());
35+
}
36+
i++;
37+
}
38+
}
39+
40+
private static void ParseOrderBy(TableSpec tabSpec, HttpRequest Request, QuerySpec spec)
41+
{
42+
spec.order = new Hashtable();
43+
int i = 0;
44+
while (Request.Query[$"order[{i}][column]"].Count != 0)
45+
{
46+
spec.order.Add(
47+
tabSpec.columns[
48+
Convert.ToInt16(
49+
Request.Query[$"order[{i}][column]"][0].ToString())],
50+
Request.Query[$"order[{i}][dir]"] == "asc" ? "asc" : "desc"
51+
);
52+
i++;
53+
}
54+
}
55+
}
56+
}

OData/FilterTranslator.cs

+300
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,300 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by a tool.
4+
// ANTLR Version: 4.5.3
5+
//
6+
// Changes to this file may cause incorrect behavior and will be lost if
7+
// the code is regenerated.
8+
// </auto-generated>
9+
//------------------------------------------------------------------------------
10+
11+
// Generated from FilterTranslator.g4 by ANTLR 4.5.3
12+
13+
// Unreachable code detected
14+
#pragma warning disable 0162
15+
// The variable '...' is assigned but its value is never used
16+
#pragma warning disable 0219
17+
// Missing XML comment for publicly visible type or member '...'
18+
#pragma warning disable 1591
19+
// Ambiguous reference in cref attribute
20+
#pragma warning disable 419
21+
22+
using Antlr4.Runtime;
23+
using Antlr4.Runtime.Atn;
24+
using Antlr4.Runtime.Misc;
25+
using DFA = Antlr4.Runtime.Dfa.DFA;
26+
27+
[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.5.3")]
28+
[System.CLSCompliant(false)]
29+
public partial class FilterTranslator : Lexer {
30+
public const int
31+
OPERATOR=1, FUNCTION=2, UNSUPPORTEDFUNCTION=3, WS=4, STRING_LITERAL=5,
32+
NUMBER=6, PROPERTY=7, TEXT=8;
33+
public static string[] modeNames = {
34+
"DEFAULT_MODE"
35+
};
36+
37+
public static readonly string[] ruleNames = {
38+
"OPERATOR", "FUNCTION", "UNSUPPORTEDFUNCTION", "WS", "STRING_LITERAL",
39+
"NUMBER", "PROPERTY", "TEXT"
40+
};
41+
42+
43+
SqlServerRestApi.SQL.TableSpec tableSpec;
44+
SqlServerRestApi.SQL.QuerySpec querySpec;
45+
int i = 0;
46+
public FilterTranslator(ICharStream input,
47+
SqlServerRestApi.SQL.TableSpec tableSpec,
48+
SqlServerRestApi.SQL.QuerySpec querySpec): base(input)
49+
{
50+
this.tableSpec = tableSpec;
51+
this.querySpec = querySpec;
52+
this.querySpec.columnFilter = new System.Collections.Hashtable();
53+
_interp = new LexerATNSimulator(this,_ATN);
54+
}
55+
56+
57+
public FilterTranslator(ICharStream input)
58+
: base(input)
59+
{
60+
_interp = new LexerATNSimulator(this,_ATN);
61+
}
62+
63+
private static readonly string[] _LiteralNames = {
64+
null, null, null, "'[a-zA-Z][a-zA-Z0-9\".\"]*('"
65+
};
66+
private static readonly string[] _SymbolicNames = {
67+
null, "OPERATOR", "FUNCTION", "UNSUPPORTEDFUNCTION", "WS", "STRING_LITERAL",
68+
"NUMBER", "PROPERTY", "TEXT"
69+
};
70+
public static readonly IVocabulary DefaultVocabulary = new Vocabulary(_LiteralNames, _SymbolicNames);
71+
72+
[System.Obsolete("Use Vocabulary instead.")]
73+
public static readonly string[] tokenNames = GenerateTokenNames(DefaultVocabulary, _SymbolicNames.Length);
74+
75+
private static string[] GenerateTokenNames(IVocabulary vocabulary, int length) {
76+
string[] tokenNames = new string[length];
77+
for (int i = 0; i < tokenNames.Length; i++) {
78+
tokenNames[i] = vocabulary.GetLiteralName(i);
79+
if (tokenNames[i] == null) {
80+
tokenNames[i] = vocabulary.GetSymbolicName(i);
81+
}
82+
83+
if (tokenNames[i] == null) {
84+
tokenNames[i] = "<INVALID>";
85+
}
86+
}
87+
88+
return tokenNames;
89+
}
90+
91+
[System.Obsolete]
92+
public override string[] TokenNames
93+
{
94+
get
95+
{
96+
return tokenNames;
97+
}
98+
}
99+
100+
[NotNull]
101+
public override IVocabulary Vocabulary
102+
{
103+
get
104+
{
105+
return DefaultVocabulary;
106+
}
107+
}
108+
109+
public override string GrammarFileName { get { return "FilterTranslator.g4"; } }
110+
111+
public override string[] RuleNames { get { return ruleNames; } }
112+
113+
public override string[] ModeNames { get { return modeNames; } }
114+
115+
public override string SerializedAtn { get { return _serializedATN; } }
116+
117+
public override void Action(RuleContext _localctx, int ruleIndex, int actionIndex) {
118+
switch (ruleIndex) {
119+
case 0 : OPERATOR_action(_localctx, actionIndex); break;
120+
121+
case 1 : FUNCTION_action(_localctx, actionIndex); break;
122+
123+
case 2 : UNSUPPORTEDFUNCTION_action(_localctx, actionIndex); break;
124+
125+
case 4 : STRING_LITERAL_action(_localctx, actionIndex); break;
126+
127+
case 6 : PROPERTY_action(_localctx, actionIndex); break;
128+
}
129+
}
130+
private void OPERATOR_action(RuleContext _localctx, int actionIndex) {
131+
switch (actionIndex) {
132+
case 0: Text = "="; break;
133+
134+
case 1: Text = "<>"; break;
135+
136+
case 2: Text = ">"; break;
137+
138+
case 3: Text = ">="; break;
139+
140+
case 4: Text = "<"; break;
141+
142+
case 5: Text = "<="; break;
143+
144+
case 6: Text = "+"; break;
145+
146+
case 7: Text = "-"; break;
147+
148+
case 8: Text = "*"; break;
149+
150+
case 9: Text = "/"; break;
151+
152+
case 10: Text = "%"; break;
153+
}
154+
}
155+
private void FUNCTION_action(RuleContext _localctx, int actionIndex) {
156+
switch (actionIndex) {
157+
case 11: Text = "odata.contains("; break;
158+
159+
case 12: Text = "odata.endswith("; break;
160+
161+
case 13: Text = "odata.indexof("; break;
162+
163+
case 14: Text = "len("; break;
164+
165+
case 15: Text = "odata.startswith("; break;
166+
167+
case 16: Text = "lower("; break;
168+
169+
case 17: Text = "lower("; break;
170+
171+
case 18: Text = "datepart(year,"; break;
172+
173+
case 19: Text = "datepart(month,"; break;
174+
175+
case 20: Text = "datepart(day,"; break;
176+
177+
case 21: Text = "datepart(hour,"; break;
178+
179+
case 22: Text = "datepart(minute,"; break;
180+
181+
case 23: Text = "datepart(second,"; break;
182+
}
183+
}
184+
private void UNSUPPORTEDFUNCTION_action(RuleContext _localctx, int actionIndex) {
185+
switch (actionIndex) {
186+
case 24: throw new System.ArgumentException("Unsupported function: " + Text); break;
187+
}
188+
}
189+
private void STRING_LITERAL_action(RuleContext _localctx, int actionIndex) {
190+
switch (actionIndex) {
191+
case 25: this.querySpec.columnFilter.Add("@p"+i, Text.Substring(1,Text.Length-2)); Text = "@p"+(i++); break;
192+
}
193+
}
194+
private void PROPERTY_action(RuleContext _localctx, int actionIndex) {
195+
switch (actionIndex) {
196+
case 26: this.tableSpec.HasColumn(Text); break;
197+
}
198+
}
199+
200+
public static readonly string _serializedATN =
201+
"\x3\xAF6F\x8320\x479D\xB75C\x4880\x1605\x191C\xAB37\x2\n\xFE\b\x1\x4\x2"+
202+
"\t\x2\x4\x3\t\x3\x4\x4\t\x4\x4\x5\t\x5\x4\x6\t\x6\x4\a\t\a\x4\b\t\b\x4"+
203+
"\t\t\t\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3"+
204+
"\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2"+
205+
"\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3"+
206+
"\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2"+
207+
"\x3\x2\x3\x2\x3\x2\x3\x2\x5\x2\x45\n\x2\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"+
208+
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"+
209+
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"+
210+
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"+
211+
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"+
212+
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"+
213+
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"+
214+
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"+
215+
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"+
216+
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"+
217+
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x5\x3\xBC\n\x3\x3"+
218+
"\x4\x3\x4\x3\x4\x3\x4\x3\x4\x3\x4\x3\x4\x3\x4\x3\x4\x3\x4\x3\x4\x3\x4"+
219+
"\x3\x4\x3\x4\x3\x4\x3\x4\x3\x4\x3\x4\x3\x4\x3\x4\x3\x4\x3\x4\x3\x4\x3"+
220+
"\x4\x3\x4\x3\x4\x3\x4\x3\x5\x6\x5\xDA\n\x5\r\x5\xE\x5\xDB\x3\x5\x3\x5"+
221+
"\x3\x6\x3\x6\a\x6\xE2\n\x6\f\x6\xE\x6\xE5\v\x6\x3\x6\x3\x6\x3\x6\x3\a"+
222+
"\x3\a\a\a\xEC\n\a\f\a\xE\a\xEF\v\a\x3\b\x3\b\a\b\xF3\n\b\f\b\xE\b\xF6"+
223+
"\v\b\x3\b\x3\b\x3\t\x6\t\xFB\n\t\r\t\xE\t\xFC\x3\xE3\x2\x2\n\x3\x2\x3"+
224+
"\x5\x2\x4\a\x2\x5\t\x2\x6\v\x2\a\r\x2\b\xF\x2\t\x11\x2\n\x3\x2\t\x5\x2"+
225+
"\v\f\xF\xF\"\"\x3\x2))\x3\x2\x33;\x3\x2\x32;\x4\x2\x43\\\x63|\x5\x2\x32"+
226+
";\x43\\\x63|\x5\x2$$*+\x30\x30\x118\x2\x3\x3\x2\x2\x2\x2\x5\x3\x2\x2\x2"+
227+
"\x2\a\x3\x2\x2\x2\x2\t\x3\x2\x2\x2\x2\v\x3\x2\x2\x2\x2\r\x3\x2\x2\x2\x2"+
228+
"\xF\x3\x2\x2\x2\x2\x11\x3\x2\x2\x2\x3\x44\x3\x2\x2\x2\x5\xBB\x3\x2\x2"+
229+
"\x2\a\xBD\x3\x2\x2\x2\t\xD9\x3\x2\x2\x2\v\xDF\x3\x2\x2\x2\r\xE9\x3\x2"+
230+
"\x2\x2\xF\xF0\x3\x2\x2\x2\x11\xFA\x3\x2\x2\x2\x13\x14\ag\x2\x2\x14\x15"+
231+
"\as\x2\x2\x15\x16\x3\x2\x2\x2\x16\x45\b\x2\x2\x2\x17\x18\ap\x2\x2\x18"+
232+
"\x19\ag\x2\x2\x19\x1A\x3\x2\x2\x2\x1A\x45\b\x2\x3\x2\x1B\x1C\ai\x2\x2"+
233+
"\x1C\x1D\av\x2\x2\x1D\x1E\x3\x2\x2\x2\x1E\x45\b\x2\x4\x2\x1F \ai\x2\x2"+
234+
" !\ag\x2\x2!\"\x3\x2\x2\x2\"\x45\b\x2\x5\x2#$\an\x2\x2$%\av\x2\x2%&\x3"+
235+
"\x2\x2\x2&\x45\b\x2\x6\x2\'(\an\x2\x2()\ag\x2\x2)*\x3\x2\x2\x2*\x45\b"+
236+
"\x2\a\x2+,\a\x63\x2\x2,-\a\x66\x2\x2-.\a\x66\x2\x2./\x3\x2\x2\x2/\x45"+
237+
"\b\x2\b\x2\x30\x31\au\x2\x2\x31\x32\aw\x2\x2\x32\x33\a\x64\x2\x2\x33\x34"+
238+
"\x3\x2\x2\x2\x34\x45\b\x2\t\x2\x35\x36\ao\x2\x2\x36\x37\aw\x2\x2\x37\x38"+
239+
"\an\x2\x2\x38\x39\x3\x2\x2\x2\x39\x45\b\x2\n\x2:;\a\x66\x2\x2;<\ak\x2"+
240+
"\x2<=\ax\x2\x2=>\x3\x2\x2\x2>\x45\b\x2\v\x2?@\ao\x2\x2@\x41\aq\x2\x2\x41"+
241+
"\x42\a\x66\x2\x2\x42\x43\x3\x2\x2\x2\x43\x45\b\x2\f\x2\x44\x13\x3\x2\x2"+
242+
"\x2\x44\x17\x3\x2\x2\x2\x44\x1B\x3\x2\x2\x2\x44\x1F\x3\x2\x2\x2\x44#\x3"+
243+
"\x2\x2\x2\x44\'\x3\x2\x2\x2\x44+\x3\x2\x2\x2\x44\x30\x3\x2\x2\x2\x44\x35"+
244+
"\x3\x2\x2\x2\x44:\x3\x2\x2\x2\x44?\x3\x2\x2\x2\x45\x4\x3\x2\x2\x2\x46"+
245+
"G\a\x65\x2\x2GH\aq\x2\x2HI\ap\x2\x2IJ\av\x2\x2JK\a\x63\x2\x2KL\ak\x2\x2"+
246+
"LM\ap\x2\x2MN\au\x2\x2NO\a*\x2\x2OP\x3\x2\x2\x2P\xBC\b\x3\r\x2QR\ag\x2"+
247+
"\x2RS\ap\x2\x2ST\a\x66\x2\x2TU\au\x2\x2UV\ay\x2\x2VW\ak\x2\x2WX\av\x2"+
248+
"\x2XY\aj\x2\x2YZ\x3\x2\x2\x2Z\xBC\b\x3\xE\x2[\\\ak\x2\x2\\]\ap\x2\x2]"+
249+
"^\a\x66\x2\x2^_\ag\x2\x2_`\az\x2\x2`\x61\aq\x2\x2\x61\x62\ah\x2\x2\x62"+
250+
"\x63\x3\x2\x2\x2\x63\xBC\b\x3\xF\x2\x64\x65\an\x2\x2\x65\x66\ag\x2\x2"+
251+
"\x66g\ap\x2\x2gh\ai\x2\x2hi\av\x2\x2ij\aj\x2\x2jk\a*\x2\x2kl\x3\x2\x2"+
252+
"\x2l\xBC\b\x3\x10\x2mn\au\x2\x2no\av\x2\x2op\a\x63\x2\x2pq\at\x2\x2qr"+
253+
"\av\x2\x2rs\au\x2\x2st\ay\x2\x2tu\ak\x2\x2uv\av\x2\x2vw\aj\x2\x2wx\a*"+
254+
"\x2\x2xy\x3\x2\x2\x2y\xBC\b\x3\x11\x2z{\av\x2\x2{|\aq\x2\x2|}\an\x2\x2"+
255+
"}~\aq\x2\x2~\x7F\ay\x2\x2\x7F\x80\ag\x2\x2\x80\x81\at\x2\x2\x81\x82\a"+
256+
"*\x2\x2\x82\x83\x3\x2\x2\x2\x83\xBC\b\x3\x12\x2\x84\x85\av\x2\x2\x85\x86"+
257+
"\aq\x2\x2\x86\x87\aw\x2\x2\x87\x88\ar\x2\x2\x88\x89\ag\x2\x2\x89\x8A\a"+
258+
"t\x2\x2\x8A\x8B\a*\x2\x2\x8B\x8C\x3\x2\x2\x2\x8C\xBC\b\x3\x13\x2\x8D\x8E"+
259+
"\a{\x2\x2\x8E\x8F\ag\x2\x2\x8F\x90\a\x63\x2\x2\x90\x91\at\x2\x2\x91\x92"+
260+
"\a*\x2\x2\x92\x93\x3\x2\x2\x2\x93\xBC\b\x3\x14\x2\x94\x95\ao\x2\x2\x95"+
261+
"\x96\aq\x2\x2\x96\x97\ap\x2\x2\x97\x98\av\x2\x2\x98\x99\aj\x2\x2\x99\x9A"+
262+
"\a*\x2\x2\x9A\x9B\x3\x2\x2\x2\x9B\xBC\b\x3\x15\x2\x9C\x9D\a\x66\x2\x2"+
263+
"\x9D\x9E\a\x63\x2\x2\x9E\x9F\a{\x2\x2\x9F\xA0\a*\x2\x2\xA0\xA1\x3\x2\x2"+
264+
"\x2\xA1\xBC\b\x3\x16\x2\xA2\xA3\aj\x2\x2\xA3\xA4\aq\x2\x2\xA4\xA5\aw\x2"+
265+
"\x2\xA5\xA6\at\x2\x2\xA6\xA7\a*\x2\x2\xA7\xA8\x3\x2\x2\x2\xA8\xBC\b\x3"+
266+
"\x17\x2\xA9\xAA\ao\x2\x2\xAA\xAB\ak\x2\x2\xAB\xAC\ap\x2\x2\xAC\xAD\aw"+
267+
"\x2\x2\xAD\xAE\av\x2\x2\xAE\xAF\ag\x2\x2\xAF\xB0\a*\x2\x2\xB0\xB1\x3\x2"+
268+
"\x2\x2\xB1\xBC\b\x3\x18\x2\xB2\xB3\au\x2\x2\xB3\xB4\ag\x2\x2\xB4\xB5\a"+
269+
"\x65\x2\x2\xB5\xB6\aq\x2\x2\xB6\xB7\ap\x2\x2\xB7\xB8\a\x66\x2\x2\xB8\xB9"+
270+
"\a*\x2\x2\xB9\xBA\x3\x2\x2\x2\xBA\xBC\b\x3\x19\x2\xBB\x46\x3\x2\x2\x2"+
271+
"\xBBQ\x3\x2\x2\x2\xBB[\x3\x2\x2\x2\xBB\x64\x3\x2\x2\x2\xBBm\x3\x2\x2\x2"+
272+
"\xBBz\x3\x2\x2\x2\xBB\x84\x3\x2\x2\x2\xBB\x8D\x3\x2\x2\x2\xBB\x94\x3\x2"+
273+
"\x2\x2\xBB\x9C\x3\x2\x2\x2\xBB\xA2\x3\x2\x2\x2\xBB\xA9\x3\x2\x2\x2\xBB"+
274+
"\xB2\x3\x2\x2\x2\xBC\x6\x3\x2\x2\x2\xBD\xBE\a]\x2\x2\xBE\xBF\a\x63\x2"+
275+
"\x2\xBF\xC0\a/\x2\x2\xC0\xC1\a|\x2\x2\xC1\xC2\a\x43\x2\x2\xC2\xC3\a/\x2"+
276+
"\x2\xC3\xC4\a\\\x2\x2\xC4\xC5\a_\x2\x2\xC5\xC6\a]\x2\x2\xC6\xC7\a\x63"+
277+
"\x2\x2\xC7\xC8\a/\x2\x2\xC8\xC9\a|\x2\x2\xC9\xCA\a\x43\x2\x2\xCA\xCB\a"+
278+
"/\x2\x2\xCB\xCC\a\\\x2\x2\xCC\xCD\a\x32\x2\x2\xCD\xCE\a/\x2\x2\xCE\xCF"+
279+
"\a;\x2\x2\xCF\xD0\a$\x2\x2\xD0\xD1\a\x30\x2\x2\xD1\xD2\a$\x2\x2\xD2\xD3"+
280+
"\a_\x2\x2\xD3\xD4\a,\x2\x2\xD4\xD5\a*\x2\x2\xD5\xD6\x3\x2\x2\x2\xD6\xD7"+
281+
"\b\x4\x1A\x2\xD7\b\x3\x2\x2\x2\xD8\xDA\t\x2\x2\x2\xD9\xD8\x3\x2\x2\x2"+
282+
"\xDA\xDB\x3\x2\x2\x2\xDB\xD9\x3\x2\x2\x2\xDB\xDC\x3\x2\x2\x2\xDC\xDD\x3"+
283+
"\x2\x2\x2\xDD\xDE\b\x5\x1B\x2\xDE\n\x3\x2\x2\x2\xDF\xE3\t\x3\x2\x2\xE0"+
284+
"\xE2\v\x2\x2\x2\xE1\xE0\x3\x2\x2\x2\xE2\xE5\x3\x2\x2\x2\xE3\xE4\x3\x2"+
285+
"\x2\x2\xE3\xE1\x3\x2\x2\x2\xE4\xE6\x3\x2\x2\x2\xE5\xE3\x3\x2\x2\x2\xE6"+
286+
"\xE7\t\x3\x2\x2\xE7\xE8\b\x6\x1C\x2\xE8\f\x3\x2\x2\x2\xE9\xED\t\x4\x2"+
287+
"\x2\xEA\xEC\t\x5\x2\x2\xEB\xEA\x3\x2\x2\x2\xEC\xEF\x3\x2\x2\x2\xED\xEB"+
288+
"\x3\x2\x2\x2\xED\xEE\x3\x2\x2\x2\xEE\xE\x3\x2\x2\x2\xEF\xED\x3\x2\x2\x2"+
289+
"\xF0\xF4\t\x6\x2\x2\xF1\xF3\t\a\x2\x2\xF2\xF1\x3\x2\x2\x2\xF3\xF6\x3\x2"+
290+
"\x2\x2\xF4\xF2\x3\x2\x2\x2\xF4\xF5\x3\x2\x2\x2\xF5\xF7\x3\x2\x2\x2\xF6"+
291+
"\xF4\x3\x2\x2\x2\xF7\xF8\b\b\x1D\x2\xF8\x10\x3\x2\x2\x2\xF9\xFB\t\b\x2"+
292+
"\x2\xFA\xF9\x3\x2\x2\x2\xFB\xFC\x3\x2\x2\x2\xFC\xFA\x3\x2\x2\x2\xFC\xFD"+
293+
"\x3\x2\x2\x2\xFD\x12\x3\x2\x2\x2\n\x2\x44\xBB\xDB\xE3\xED\xF4\xFC\x1E"+
294+
"\x3\x2\x2\x3\x2\x3\x3\x2\x4\x3\x2\x5\x3\x2\x6\x3\x2\a\x3\x2\b\x3\x2\t"+
295+
"\x3\x2\n\x3\x2\v\x3\x2\f\x3\x3\r\x3\x3\xE\x3\x3\xF\x3\x3\x10\x3\x3\x11"+
296+
"\x3\x3\x12\x3\x3\x13\x3\x3\x14\x3\x3\x15\x3\x3\x16\x3\x3\x17\x3\x3\x18"+
297+
"\x3\x3\x19\x3\x4\x1A\b\x2\x2\x3\x6\x1B\x3\b\x1C";
298+
public static readonly ATN _ATN =
299+
new ATNDeserializer().Deserialize(_serializedATN.ToCharArray());
300+
}

0 commit comments

Comments
 (0)