mirror of
https://github.com/microsoft/regorus.git
synced 2026-08-05 02:16:11 +00:00
Authored by anakrish and mingweishih Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
175 lines
3.0 KiB
Markdown
175 lines
3.0 KiB
Markdown
|
|
```
|
|
module: package imports { rule }
|
|
|
|
package: "package" path-ref
|
|
|
|
imports: { "import" path-ref [ "as" var ] }
|
|
|
|
path-ref: path-ref NO_WS "." NO_WS IDENT
|
|
| path-ref NO_WS "[" STRING "]"
|
|
| IDENT
|
|
|
|
rule: default-rule
|
|
| spec-rule
|
|
|
|
default-rule: "default" rule-ref assign-op term
|
|
|
|
spec-rule: rule-head rule-bodies
|
|
|
|
rule-head: func-rule
|
|
| contains-rule
|
|
| object-rule
|
|
| set-rule
|
|
| compr-rule
|
|
|
|
func-rule: rule-ref "(" term { "," term } [","] ")" [ rule-assign ]
|
|
|
|
contains-rule: rule-ref "contains" or-expr
|
|
|
|
object-rule: rule-ref NO_WS "[" membership-expr "]" rule-assign
|
|
|
|
set-rule: rule-ref NO_WS "[" membership-expr "]"
|
|
|
|
compr-rule: rule-ref [ rule-assign ]
|
|
|
|
rule-ref: rule-ref NO_WS "." NO_WS var
|
|
| path-ref NO_WS "[" membership-expr "]"
|
|
| var
|
|
|
|
rule-assign: assign-op membership-expr
|
|
|
|
rule-bodies: "if" "{" query "}" alternatives
|
|
| "if" literal-stmt alternatives
|
|
| "{" query "}" alternatives
|
|
|
|
alternatives: query-blocks
|
|
| else-blocks
|
|
|
|
query-blocks: { "{" query "}" }
|
|
|
|
else-blocks: { else-block }
|
|
|
|
else-block: "else" [rule-assign] "if" "{" query "}"
|
|
| "else" [rule-assign] "if" literal-stmt
|
|
| "else" [rule-assign] "{" query "}"
|
|
|
|
assign-op: "=" | ":="
|
|
|
|
query: literal-stmt { sep literal-stmt }
|
|
|
|
sep: ";" | "\n" | "\r\n"
|
|
|
|
literal-stmt: literal with-modifiers
|
|
|
|
with-modifiers: { "with" path-ref "as" in-expr }
|
|
|
|
literal: some
|
|
| every
|
|
| expr
|
|
| not-expr
|
|
|
|
some: some-vars
|
|
| some-in
|
|
|
|
some-vars: "some" var { "," var }
|
|
|
|
some-in: "some" ref [ "," ref ] "in"
|
|
|
|
every: "every" var [ "," var ] "in" bool-expr "{" query "}"
|
|
|
|
expr: assign-expr
|
|
|
|
not-expr: "not" assign-expr
|
|
|
|
assign-expr: ref assign-op membership-expr
|
|
|
|
membership-expr: membership-expr "in" bool-expr
|
|
| bool-expr "," bool-expr
|
|
| bool-expr
|
|
|
|
in-expr: in-expr "in" bool-expr
|
|
| bool-expr
|
|
|
|
bool-expr: bool-expr bool-op or-expr
|
|
| or-expr
|
|
|
|
bool-op: "<" | "<=" | "==" | ">=" | ">" | "!="
|
|
|
|
or-expr: or-expr "|" and-expr
|
|
| and-expr
|
|
|
|
and-expr: and-expr "&" arith-expr
|
|
| arith-expr
|
|
|
|
arith-expr: arith-expr ("+" | "-") mul-div-expr
|
|
| mul-div-expr
|
|
|
|
mul-div-expr: mul-div-expr ("*" | "/") term
|
|
| term
|
|
|
|
term: ref
|
|
|
|
ref: scalar-or-var
|
|
| compr-set-or-object
|
|
| compr-or-array
|
|
| unary-expr
|
|
| parens-expr
|
|
| ref-dot
|
|
| ref-brack
|
|
| call-expr
|
|
|
|
ref-dot: ref NO_WS "." NO_WS var
|
|
|
|
ref-brack: ref NO_WS "[" in-expr "]"
|
|
|
|
call-expr: path-ref NO_WS "(" call-args [","] ")"
|
|
|
|
call-args: in-expr { "," in-expr }
|
|
|
|
parens-expr: "(" membership-expr ")"
|
|
|
|
unary-expr: "-" in-expr
|
|
|
|
compr-set-or-object: set-compr
|
|
| set
|
|
| object-compr
|
|
| object
|
|
|
|
set-compr: "{" compr "}"
|
|
|
|
# Set must have at least one item.
|
|
set: "{" in-expr { "," in-expr } [","] "}"
|
|
| "set(" ")" # empty set
|
|
|
|
object: "{" field { "," field } [","] "}"
|
|
| "{" "}" # empty object
|
|
|
|
field: in-expr ":" in-expr
|
|
|
|
# Comprehension or array
|
|
compr-or-array: array-compr
|
|
| array
|
|
|
|
array-compr: "[" compr "]"
|
|
|
|
array: "[" in-expr { "," in-expr } [","] "]"
|
|
| "[" "]" # Empty array
|
|
|
|
# Comprehension
|
|
compr: ref "|" query
|
|
|
|
scalar-or-var: var
|
|
| NUMBER
|
|
| STRING
|
|
| RAWSTRING
|
|
| "null"
|
|
| "true"
|
|
| "false"
|
|
|
|
var: IDENT
|
|
| non-imported-future-keyword
|
|
|
|
non-imported-future-future-keyword: "contains" | "every" | "if" | "in"
|
|
```
|