Skip to content

Instantly share code, notes, and snippets.

@affo
Created May 10, 2019 17:09
Show Gist options
  • Save affo/bde5b78bfdecbfe6901965920e1018b6 to your computer and use it in GitHub Desktop.
Save affo/bde5b78bfdecbfe6901965920e1018b6 to your computer and use it in GitHub Desktop.
Flux language grammar in BNF form
File = File-a File-b StatementList empty
File-a = '' | PackageClause
PackageClause = "package" identifier empty
empty = ''
File-b = '' | ImportList
ImportList = ImportList-a empty
ImportList-a = '' | ImportDeclaration ImportList-a
ImportDeclaration = "import" ImportDeclaration-a string_lit
ImportDeclaration-a = '' | identifier
StatementList = StatementList-a empty
StatementList-a = '' | Statement StatementList-a
Statement = OptionAssignment | BuiltinStatement | TestStatement | IdentStatement | ReturnStatement | ExpressionStatement empty
OptionAssignment = "option" identifier OptionAssignmentSuffix empty
OptionAssignmentSuffix = AssignStatement | "empty" identifier AssignStatement empty
AssignStatement = "=" Expression empty
Expression = ConditionalExpression empty
ConditionalExpression = LogicalOrExpression | "if" Expression "then" Expression "else" Expression empty
LogicalOrExpression = LogicalAndExpression LogicalOrExpression-a empty
LogicalAndExpression = UnaryLogicalExpression LogicalAndExpression-a empty
UnaryLogicalExpression = ComparisonExpression | UnaryLogicalOperator UnaryLogicalExpression empty
ComparisonExpression = AdditiveExpression ComparisonExpression-a empty
AdditiveExpression = MultiplicativeExpression AdditiveExpression-a empty
MultiplicativeExpression = PipeExpression MultiplicativeExpression-a empty
PipeExpression = UnaryExpression PipeExpression-a empty
UnaryExpression = PostfixExpression | PrefixOperator UnaryExpression empty
PostfixExpression = PrimaryExpression PostfixExpression-a empty
PrimaryExpression = identifer | int_lit | float_lit | string_lit | regex_lit | duration_lit | pipe_receive_lit | ObjectLiteral | ArrayLiteral | ParenExpression empty
ObjectLiteral = "{" PropertyList "}" empty
PropertyList = PropertyList-a empty
PropertyList-a = '' | Property PropertyList-a-a
Property = identifier Property-a | string_lit ":" Expression empty
Property-a = '' | ":" Expression
PropertyList-a-a = '' | "," Property PropertyList-a-a
ArrayLiteral = "[" ExpressionList "]" empty
ExpressionList = ExpressionList-a empty
ExpressionList-a = '' | Expression ExpressionList-a-a
ExpressionList-a-a = '' | "," Expression ExpressionList-a-a
ParenExpression = "(" ParenExpressionBody empty | "(" Expression ")" empty
ParenExpressionBody = ")" FunctionExpressionSuffix | identifer ParenIdentExpression | Expression ")" empty
FunctionExpressionSuffix = "=>" FunctionBodyExpression empty
FunctionBodyExpression = Block | Expression empty
Block = "{" StatementList "}" empty
ParenIdentExpression = ")" ParenIdentExpression-a | "=" Expression ParenIdentExpression-b ")" FunctionExpressionSuffix empty | "," ParameterList ")" FunctionExpressionSuffix | ExpressionSuffix ")" empty
ParenIdentExpression-a = '' | FunctionExpressionSuffix
ParenIdentExpression-b = '' | "," ParameterList
ParameterList = ParameterList-a empty
ParameterList-a = '' | Parameter ParameterList-a-a
Parameter = identifer Parameter-a empty
Parameter-a = '' | "=" Expression
ParameterList-a-a = '' | "," Parameter ParameterList-a-a
ExpressionSuffix = ExpressionSuffix-a ExpressionSuffix-b ExpressionSuffix-c ExpressionSuffix-d ExpressionSuffix-e ExpressionSuffix-f ExpressionSuffix-g empty
ExpressionSuffix-a = '' | PostfixOperator ExpressionSuffix-a
PostfixOperator = MemberExpression | CallExpression | IndexExpression empty
MemberExpression = DotExpression | MemberBracketExpression
DotExpression = "empty" identifer
MemberBracketExpression = "[" string "]" empty
CallExpression = "(" PropertyList ")" empty
IndexExpression = "[" Expression "]" empty
ExpressionSuffix-b = '' | PipeExpressionSuffix ExpressionSuffix-b
PipeExpressionSuffix = PipeOperator UnaryExpression empty
PipeOperator = pipe_forward empty
ExpressionSuffix-c = '' | MultiplicativeExpressionSuffix ExpressionSuffix-c
MultiplicativeExpressionSuffix = MultiplicativeOperator PipeExpression empty
MultiplicativeOperator = "*" | "/" empty
ExpressionSuffix-d = '' | AdditiveExpressionSuffix ExpressionSuffix-d
AdditiveExpressionSuffix = AdditiveOperator MultiplicativeExpression empty
AdditiveOperator = "+" | "-" empty
ExpressionSuffix-e = '' | ComparisonExpressionSuffix ExpressionSuffix-e
ComparisonExpressionSuffix = ComparisonOperator AdditiveExpression empty
ComparisonOperator = "==" | "!=" | "<" | "<=" | ">" | ">=" | "=~" | "!~" empty
ExpressionSuffix-f = '' | LogicalAndExpressionSuffix ExpressionSuffix-f
LogicalAndExpressionSuffix = LogicalAndOperator UnaryLogicalExpression empty
LogicalAndOperator = "and" empty
ExpressionSuffix-g = '' | LogicalOrExpressionSuffix ExpressionSuffix-g
LogicalOrExpressionSuffix = LogicalOrOperator LogicalAndExpression empty
LogicalOrOperator = "or" empty
PostfixExpression-a = '' | PostfixOperator PostfixExpression-a
PrefixOperator = "+" | "-" empty
PipeExpression-a = '' | PipeExpressionSuffix PipeExpression-a
MultiplicativeExpression-a = '' | MultiplicativeExpressionSuffix MultiplicativeExpression-a
AdditiveExpression-a = '' | AdditiveExpressionSuffix AdditiveExpression-a
ComparisonExpression-a = '' | ComparisonExpressionSuffix ComparisonExpression-a
UnaryLogicalOperator = "not" empty
LogicalAndExpression-a = '' | LogicalAndExpressionSuffix LogicalAndExpression-a
LogicalOrExpression-a = '' | LogicalOrExpressionSuffix LogicalOrExpression-a
BuiltinStatement = "builtin" identifier empty
TestStatement = "test" identifier AssignStatement empty
IdentStatement = identifer IdentStatement-a empty
IdentStatement-a = AssignStatement | ExpressionSuffix
ReturnStatement = "return" Expression empty
ExpressionStatement = Expression empty
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment