/
Linq.nitra
63 lines (49 loc) · 2.12 KB
/
Linq.nitra
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
namespace CSharp
{
syntax module Linq
{
using Nitra.Core;
using CSharp.Core;
using CSharp.TokenNames;
using Literals;
using CSharp.CsIdentifiers;
using Types;
using Expressions;
keyword regex ['A'..'Z', 'a'..'z', '_'..'_']+ rule S;
alias BooleanExpression = Expression;
extend syntax Expression
{
| Query = FromClause sm QueryBody;
}
// "from" ignored
regex LinqKeywordToken = "where" | "join" | "on" | "equals" | "into" | "let" | "orderby" | "ascending" | "descending" | "select" | "group" | "by";
token LinqKeyword = Name=LinqKeywordToken !CsIdentifiers.IdentifierPartCharacters;
syntax LinqExpression = !LinqKeyword Expression;
syntax LinqType = !LinqKeyword AnyType;
syntax LinqName = !LinqKeyword Name;
syntax FromClause
{
| Common = "from" sm LinqName sm "in" sm LinqExpression;
| Casted = "from" sm LinqType sm LinqName sm "in" sm LinqExpression;
}
regex OrderingDirection = "ascending" | "descending";
syntax SelectOrGroupClause
{
| "select" sm LinqExpression;
| "group" sm LinqExpression sm "by" sm LinqExpression;
}
syntax QueryBody = QueryBodyClause* SelectOrGroupClause QueryContinuation?;
syntax IntoClause = "into" sm LinqName;
syntax Ordering = LinqExpression OrderingDirection?;
syntax QueryBodyClause
{
| From = FromClause; // from-clause
| Let = "let" sm LinqName sm "=" sm LinqExpression; // let-clause
| Where = "where" sm BooleanExpression; // where-clause
| Join1 = "join" sm LinqName sm "in" sm LinqExpression sm "on" sm LinqExpression sm "equals" sm LinqExpression (sm IntoClause)?; // join-clause && join-into-clause
| Join2 = "join" sm LinqType sm LinqName sm "in" sm LinqExpression sm "on" sm LinqExpression sm "equals" sm LinqExpression (sm IntoClause)?; // join-clause && join-into-clause
| Orderby = "orderby" sm (Ordering; ","sm)+; // orderby-clause
}
syntax QueryContinuation = IntoClause sm QueryBody;
}
}