Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions src/main/grammar/Rego.bnf
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
ELSE = 'else'
IF = 'if'
CONTAINS = 'contains'
EVERY = 'every'
IN = 'in'
LBRACE = '{'
RBRACE = '}'
SEMICOLON = ';'
Expand Down Expand Up @@ -77,9 +79,11 @@ rule-body ::= else-expr | query-block
else-expr ::= else (':=' | '=') expr "if"? query-block? | else (':=' | '=')? "if"? query-block
query-block ::= "{" query "}"
query ::= ( literal |';' )+
literal ::= ( some-decl | literal-expr | "not" literal-expr ) with-modifier*
literal ::= ( every-decl | some-in-decl | some-decl | literal-expr | "not" literal-expr ) with-modifier*
with-modifier ::= "with" term "as" term
some-in-decl ::= "some" var ( "," var )? "in" expr
some-decl ::= "some" var ( "," var )*
every-decl ::= "every" var ( "," var )? "in" expr query-block
literal-expr ::= expr ((':=' | '=') expr)?
expr ::= expr-infix | (expr-call ref-arg*) | term
expr-call ::= var ref-arg-dot* "(" ( expr ( "," expr )* ","? )? ")"
Expand All @@ -90,15 +94,15 @@ array-compr ::= "[" term "|" query "]"
set-compr ::= "{" term "|" query "}"
object-compr ::= "{" term-pair "|" query "}"
term-pair ::= term ":" term
infix-operator ::= bool-operator | arith-operator | bin-operator
infix-operator ::= bool-operator | arith-operator | bin-operator | "in"
bool-operator ::= "==" | "!=" | "<" | ">" | ">=" | "<="
arith-operator ::= "+" | "-" | "*" | "/" | "%"
bin-operator ::= "&" | "|"
ref ::= ( expr-call | array | object | set | array-compr | object-compr | set-compr |var ) ref-arg*
ref-arg ::= ref-arg-dot | ref-arg-brack
ref-arg-brack ::= "[" ( expr | "_" ) "]"
ref-arg-dot ::= "." var
var ::= ASCII_LETTER | "contains"
var ::= ASCII_LETTER | "contains" | "in" | "every" | "if"
scalar ::= string | NUMBER | TRUE | FALSE | NULL
string ::= STRING_TOKEN| RAW_STRING
array ::= '[' expr? ( ',' expr )* ','? ']'
Expand Down
2 changes: 2 additions & 0 deletions src/main/grammar/RegoLexer.flex
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ COMMENT=[ \t]*#[^\r\n]*
"}" { return RBRACE; }
";" { return SEMICOLON; }
"some" { return SOME; }
"every" { return EVERY; }
"in" { return IN; }
"contains" { return CONTAINS; }
"," { return COMMA; }
"." { return DOT; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ val REGO_KEYWORDS = tokenSetOf(
RegoTypes.NOT,
RegoTypes.WITH,
RegoTypes.IF,
RegoTypes.CONTAINS
RegoTypes.CONTAINS,
RegoTypes.EVERY,
RegoTypes.IN
)

val REGO_OPERATOR = tokenSetOf(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,8 @@ class RegoParsingV1Test : ParsingTestCase(
fun `test contains partial set`() = doTestNoError()
fun `test one line bodies`() = doTestNoError()
fun `test contains identifier uses`() = doTestNoError()
fun `test every expressions`() = doTestNoError()
fun `test in operator`() = doTestNoError()
fun `test some in`() = doTestNoError()
fun `test keywords as identifiers`() = doTestNoError()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package play

allow if {
every x in input.users {
x.active == true
}
}

valid_pairs if {
every k, v in input.config {
k != ""
v != null
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package play

allow if {
"admin" in input.roles
}

deny if {
not "guest" in input.roles
}

has_pair if {
["a", 1] in input.entries
}

is_admin if {
x := "admin" in input.roles
x
}

log_membership if {
print("admin" in input.roles)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package play

if := 1

every := 2

uses_if if {
input.if == 1
}

uses_every if {
input.every.woo != null
}

check_if(if) := true

check_every(every, foo) := every + foo
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package play

allow if {
some x in input.users
x.active == true
}

has_admin if {
some k, v in input.roles
v == "admin"
}
Loading