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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
| using D2165063.Models;
using Sprache;
namespace D2165063.Grammar;
public static class Semantics
{
public static readonly Parser<Query> Query =
from leading in Primitives.DropWhiteSpaces()
from @select in Select
from @from in From
from @followup in FromFollowUp
from trailing in Primitives.DropWhiteSpaces()
select new Query(@select, @from, followup);
public static readonly Parser<ColumnName> ColumnName =
from name in Primitives.QualifiedName.Or<IName>(Primitives.SimpleName)
select new ColumnName(name);
public static readonly Parser<ISelector> Selector =
from leading in Primitives.DropWhiteSpaces()
from selector in Primitives.LitteralValueSelector.Or<ISelector>(ColumnName)
from trailing in Primitives.DropWhiteSpaces()
select selector;
public static readonly Parser<IEnumerable<ISelector>> Selectors =
from selectors in Primitives.Nested(
Parse.Chars('('),
Primitives.Collection(Selector, Parse.Char(',')),
Parse.Char(')')
)
select selectors;
public static readonly Parser<Select> Select =
from leading in Primitives.DropWhiteSpaces()
from keyword in Parse.IgnoreCase("select")
from interspace in Primitives.DropWhiteSpaces()
from selectors in Selectors
from trailing in Primitives.DropWhiteSpaces()
select new Select(selectors);
public static readonly Parser<IName> Alias =
from keyword in Parse.IgnoreCase("as")
from space in Parse.WhiteSpace.AtLeastOnce()
from name in Primitives.SimpleName
select name;
public static readonly Parser<TableName> TableName =
from name in Primitives.Name
from alias in Alias.Optional()
select new TableName(name, alias.IsDefined ? alias.Get() : null);
public static readonly Parser<From> From =
from leading in Primitives.DropWhiteSpaces()
from keyword in Parse.IgnoreCase("from")
from interspace in Primitives.DropWhiteSpaces()
from table in Primitives.Nested(Parse.Chars('('), TableName, Parse.Char(')'))
from trailing in Primitives.DropWhiteSpaces()
select new From(table);
public static readonly Parser<With> With =
from leading in Primitives.DropWhiteSpaces()
from keyword in Parse.IgnoreCase("with")
from interspace in Primitives.DropWhiteSpaces()
from table in Primitives.Nested(Parse.Chars('('), TableName, Parse.Char(')'))
from trailing in Primitives.DropWhiteSpaces()
select new With(table);
public static readonly Parser<Link> Link =
from leading in Primitives.DropWhiteSpaces()
from keyword in Parse.IgnoreCase("link")
from interspace in Parse.WhiteSpace.AtLeastOnce()
from number in Parse.Number
from trailing in Primitives.DropWhiteSpaces()
select new Link(number);
public static readonly Parser<Link> UsingLink =
from leading in Primitives.DropWhiteSpaces()
from _ in Parse.IgnoreCase("using")
from space in Parse.WhiteSpace.AtLeastOnce()
from link in Link
from trailing in Primitives.DropWhiteSpaces()
select link;
public static readonly Parser<Plus> Plus =
from leading in Primitives.DropWhiteSpaces()
from keyword in Parse.IgnoreCase("plus")
from interspace in Primitives.DropWhiteSpaces()
from tuple in Primitives.Nested(
Parse.Chars('('),
from leading in Primitives.DropWhiteSpaces()
from table in Primitives.Name
from interspace in Primitives.DropWhiteSpaces()
from link in UsingLink.Optional()
from interspace2 in Primitives.DropWhiteSpaces()
from alias in Alias.Optional()
select (table, link, alias),
Parse.Char(')'))
let table = new TableName(tuple.table, tuple.alias.GetOrDefault())
from trailing in Primitives.DropWhiteSpaces()
select new Plus(table, tuple.link.GetOrDefault());
public static readonly Parser<string> Operator =
from op in Parse.String("=")
.Or(Parse.String("!="))
.Or(Parse.String("<="))
.Or(Parse.String("<"))
.Or(Parse.String(">="))
.Or(Parse.String(">"))
.Text()
select op;
public static readonly Parser<string> CombinationOperator =
from op in Parse.IgnoreCase("and")
.Or(Parse.IgnoreCase("or"))
.Text()
select op.ToLower();
public static readonly Parser<Comparison> Comparison =
from leading in Primitives.DropWhiteSpaces()
from left in Selector
from op in Primitives.Nested(Primitives.DropWhiteSpaces(), Operator, Primitives.DropWhiteSpaces())
from right in Selector
from trailing in Primitives.DropWhiteSpaces()
select new Comparison(left, op, right);
public static Parser<Combination> Combine<T>(this Parser<T> parser) where T : ICondition =>
from leading in Primitives.DropWhiteSpaces()
from left in parser
from interspace in Primitives.DropWhiteSpaces()
from op in CombinationOperator
from interspace2 in Primitives.DropWhiteSpaces()
from right in Condition
from trailing in Primitives.DropWhiteSpaces()
select new Combination(left, op, right);
public static readonly Parser<Priorization> Priorization =
from leading in Primitives.DropWhiteSpaces()
from condition in Primitives.Nested(
Parse.Char('(').ThenDropWhiteSpaces(),
Condition,
Primitives.DropWhiteSpaces().Then(_ => Parse.Char(')'))
)
from trailing in Primitives.DropWhiteSpaces()
select new Priorization(condition);
public static Parser<ICondition> Condition =>
from condition in Priorization.Combine()
.Or<ICondition>(Comparison.Combine())
.Or(Priorization)
.Or(Comparison)
select condition;
public static readonly Parser<Where> Where =
from leading in Primitives.DropWhiteSpaces()
from keyword in Parse.IgnoreCase("where")
from interspace in Primitives.DropWhiteSpaces()
from condition in Primitives.Nested(
Parse.Chars('(').ThenDropWhiteSpaces(),
Condition,
Primitives.DropWhiteSpaces().Then(_ => Parse.Char(')')))
from trailing in Primitives.DropWhiteSpaces()
select new Where(condition);
public static readonly Parser<IFromFollowUpStatement> FromFollowUpStatement =
from statement in With.Or<IFromFollowUpStatement>(Plus)
select statement;
public static readonly Parser<FromFollowUp> FromFollowUp =
from leading in Primitives.DropWhiteSpaces()
from statements in Primitives.Collection(FromFollowUpStatement, Parse.WhiteSpace.AtLeastOnce())
from trailing in Primitives.DropWhiteSpaces()
select new FromFollowUp(statements);
} |
Partager