linq - LINQ的EBNF还是BNF?连接的关联性?其他条款?
问题描述
我正在寻找 LINQ 的 BNF 或 EBNF。似乎 C# 的语法规范在任何地方都不容易获得,但是如果没有找到,LINQ 片段可能很容易推断。
特别是,我无法弄清楚联接的优先级/关联性。请注意,连接可能包括嵌套查询,例如:
var result = from a in T
join b in B on a.key equals b.key
join c in C on ???
where ...
...
这是我到目前为止提出的语法:
<Query> ::= <From> <Body>
<Body> ::= <Clause>* <Conclusion> <Continutation>?
<Clause> ::= <From> | <Join> | <Let> | <Order> | <OrderBy>
<From> ::= "from " <Item> "in " <Source>
<Join> ::= "join " <Item> "in " <Source> "on " <Key> "equals " <Key> ( "into " <Item> )?
<Let> ::= "let " <Item> " = " <Selection>
<Order> ::= "where " <Condition>
<OrderBy> ::= "orderby " ( <Key> ( "ascending " | "descending " )?)+
<Conclusion> ::= <Select> | <Group>
<Select> ::= " select " <Selection>
<Group> ::= " group " <Selection> "by " <Key>
<Continutation> ::= "into " <Item> <Body>
<Item> ::= "x" [0-9]+ " "
<Source> ::= "DB" [0-9]+ <Id> " "
<Selection> ::= "new " "{ " <Fields> "} "
<Key> ::= "K" [0-9]+ <Id> " "
<Condition> ::= <And>
<And> ::= <Or> ( " && " <Or> )
<Or> ::= <Not> ( " || " <Not> )
<Not> ::= " !"? ( "(" <Condition> ")" | <Comparison> )
<Comparison> ::= <Value> ( "<" | ">" | "==" | "<=" | ">=" | "!=" ) <Value>
<Value> ::= <Key> | <Number>
<Number> ::= [0-0] | ( [1-9] [0-9]* )
<Fields> ::= <Field> (", " <Field>)*
<Field> ::= "F" <Item>
<Id> ::= ( [a-z] | [A-Z] ) ( E | ( [0-9] | [A-Z] | [a-z] ) )
例如,您可以基于此语法生成示例查询。
解决方案
本文档指定查询语法:
query_expression
: from_clause query_body
;
from_clause
: 'from' type? identifier 'in' expression
;
query_body
: query_body_clauses? select_or_group_clause query_continuation?
;
query_body_clauses
: query_body_clause
| query_body_clauses query_body_clause
;
query_body_clause
: from_clause
| let_clause
| where_clause
| join_clause
| join_into_clause
| orderby_clause
;
let_clause
: 'let' identifier '=' expression
;
where_clause
: 'where' boolean_expression
;
join_clause
: 'join' type? identifier 'in' expression 'on' expression 'equals' expression
;
join_into_clause
: 'join' type? identifier 'in' expression 'on' expression 'equals' expression 'into' identifier
;
orderby_clause
: 'orderby' orderings
;
orderings
: ordering (',' ordering)*
;
ordering
: expression ordering_direction?
;
ordering_direction
: 'ascending'
| 'descending'
;
select_or_group_clause
: select_clause
| group_clause
;
select_clause
: 'select' expression
;
group_clause
: 'group' expression 'by' expression
;
query_continuation
: 'into' identifier query_body
;
推荐阅读
- kotlin - 在 Kotlin 中获取 Any 变量的枚举值列表
- swift - Swiftui foreach 在按钮数组上循环
- php - 多行按类名调用函数
- react-native - React Native如何更改显示wifi和时间的iphone顶部的颜色
- c++ - 如何在 Linux for Windows 上通过 MinGW 使用静态 ICU 构建 Boost
- ibm-cloud - IBM Watson api.eu-gb.dataplatform.cloud.ibm.com的服务器IP地址找不到?
- javascript - 使用 React Router 进行按钮导航
- excel - Excel:通过条件公式将值自动从一张表复制到另一张表
- swift - 在不为用户打开视图的情况下执行应用程序代码
- c++ - 在基于范围的 for 循环期间插入 std::list 的后面