; Copyright (C) 2019-2022 Aleo Systems Inc. ; This file is part of the Leo library. ; The Leo library is free software: you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, either version 3 of the License, or ; (at your option) any later version. ; The Leo library is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; You should have received a copy of the GNU General Public License ; along with the Leo library. If not, see . ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Lexical Grammar ; --------------- character = %x0-10FFFF ; any Unicode code point horizontal-tab = %x9 ; line-feed = %xA ; carriage-return = %xD ; space = %x20 ; double-quote = %x22 ; " single-quote = %x27 ; ' not-star = %x0-29 / %x2B-10FFFF ; anything but * not-star-or-slash = %x0-29 / %x2B-2E / %x30-D7FF / %xE000-10FFFF ; anything but * or / not-line-feed-or-carriage-return = %x0-9 / %xB-C / %xE-D7FF / %xE000-10FFFF ; anything but or not-double-quote-or-backslash = %x0-21 / %x23-5B / %x5D-D7FF / %xE000-10FFFF ; anything but " or \ not-single-quote-or-backslash = %x0-26 / %x28-5B / %x5D-D7FF / %xE000-10FFFF ; anything but ' or \ line-terminator = line-feed / carriage-return / carriage-return line-feed whitespace = space / horizontal-tab / line-terminator comment = block-comment / end-of-line-comment block-comment = "/*" rest-of-block-comment rest-of-block-comment = "*" rest-of-block-comment-after-star / not-star rest-of-block-comment rest-of-block-comment-after-star = "/" / "*" rest-of-block-comment-after-star / not-star-or-slash rest-of-block-comment end-of-line-comment = "//" *not-line-feed-or-carriage-return keyword = %s"address" / %s"bool" / %s"char" / %s"console" / %s"const" / %s"else" / %s"field" / %s"for" / %s"function" / %s"group" / %s"i8" / %s"i16" / %s"i32" / %s"i64" / %s"i128" / %s"if" / %s"in" / %s"let" / %s"return" / %s"u8" / %s"u16" / %s"u32" / %s"u64" / %s"u128" uppercase-letter = %x41-5A ; A-Z lowercase-letter = %x61-7A ; a-z letter = uppercase-letter / lowercase-letter decimal-digit = %x30-39 ; 0-9 octal-digit = %x30-37 ; 0-7 hexadecimal-digit = decimal-digit / "a" / "b" / "c" / "d" / "e" / "f" identifier = letter *( letter / decimal-digit / "_" ) ; but not a keyword or a boolean literal or aleo1... numeral = 1*decimal-digit unsigned-literal = numeral ( %s"u8" / %s"u16" / %s"u32" / %s"u64" / %s"u128" ) signed-literal = numeral ( %s"i8" / %s"i16" / %s"i32" / %s"i64" / %s"i128" ) field-literal = numeral %s"field" product-group-literal = numeral %s"group" boolean-literal = %s"true" / %s"false" address-literal = %s"aleo1" 58( lowercase-letter / decimal-digit ) character-literal = single-quote character-literal-element single-quote character-literal-element = not-single-quote-or-backslash / simple-character-escape / ascii-character-escape / unicode-character-escape single-quote-escape = "\" single-quote ; \' double-quote-escape = "\" double-quote ; \" backslash-escape = "\\" line-feed-escape = %s"\n" carriage-return-escape = %s"\r" horizontal-tab-escape = %s"\t" null-character-escape = "\0" simple-character-escape = single-quote-escape / double-quote-escape / backslash-escape / line-feed-escape / carriage-return-escape / horizontal-tab-escape / null-character-escape ascii-character-escape = %s"\x" octal-digit hexadecimal-digit unicode-character-escape = %s"\u{" 1*6hexadecimal-digit "}" string-literal = double-quote *string-literal-element double-quote string-literal-element = not-double-quote-or-backslash / simple-character-escape / ascii-character-escape / unicode-character-escape atomic-literal = unsigned-literal / signed-literal / field-literal / product-group-literal / boolean-literal / address-literal / character-literal / string-literal symbol = "!" / "&&" / "||" / "==" / "!=" / "<" / "<=" / ">" / ">=" / "+" / "-" / "*" / "/" / "**" / "=" / "(" / ")" / "{" / "}" / "," / "." / ".." / ";" / ":" / "?" / "->" / "_" / %s")group" token = keyword / identifier / atomic-literal / symbol lexeme = token / comment / whitespace ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Syntactic Grammar ; ----------------- unsigned-type = %s"u8" / %s"u16" / %s"u32" / %s"u64" / %s"u128" signed-type = %s"i8" / %s"i16" / %s"i32" / %s"i64" / %s"i128" integer-type = unsigned-type / signed-type field-type = %s"field" group-type = %s"group" arithmetic-type = integer-type / field-type / group-type boolean-type = %s"bool" address-type = %s"address" character-type = %s"char" scalar-type = boolean-type / arithmetic-type / address-type / character-type type = scalar-type group-coordinate = ( [ "-" ] numeral ) / "+" / "-" / "_" affine-group-literal = "(" group-coordinate "," group-coordinate %s")group" literal = atomic-literal / affine-group-literal group-literal = product-group-literal / affine-group-literal primary-expression = identifier / literal / "(" expression ")" / identifier function-arguments function-arguments = "(" [ expression *( "," expression ) [ "," ] ] ")" unary-expression = primary-expression / "!" unary-expression / "-" unary-expression exponential-expression = unary-expression / unary-expression "**" exponential-expression multiplicative-expression = exponential-expression / multiplicative-expression "*" exponential-expression / multiplicative-expression "/" exponential-expression additive-expression = multiplicative-expression / additive-expression "+" multiplicative-expression / additive-expression "-" multiplicative-expression ordering-expression = additive-expression / additive-expression "<" additive-expression / additive-expression ">" additive-expression / additive-expression "<=" additive-expression / additive-expression ">=" additive-expression equality-expression = ordering-expression / ordering-expression "==" ordering-expression / ordering-expression "!=" ordering-expression conjunctive-expression = equality-expression / conjunctive-expression "&&" equality-expression disjunctive-expression = conjunctive-expression / disjunctive-expression "||" conjunctive-expression conditional-expression = disjunctive-expression / disjunctive-expression "?" expression ":" expression expression = conditional-expression statement = expression-statement / return-statement / variable-declaration / constant-declaration / conditional-statement / loop-statement / assignment-statement / console-statement / block block = "{" *statement "}" expression-statement = expression ";" return-statement = %s"return" expression ";" variable-declaration = %s"let" identifier ":" type "=" expression ";" constant-declaration = %s"const" identifier ":" type "=" expression ";" branch = %s"if" expression block conditional-statement = branch / branch %s"else" block / branch %s"else" conditional-statement loop-statement = %s"for" identifier ":" type %s"in" expression ".." expression block assignment-operator = "=" assignment-statement = expression assignment-operator expression ";" console-statement = %s"console" "." console-call ";" console-call = assert-call / print-call assert-call = %s"assert" "(" expression ")" print-function = %s"error" / %s"log" print-arguments = "(" string-literal *( "," expression ) [ "," ] ")" print-call = print-function print-arguments function-declaration = %s"function" identifier "(" [ function-parameters ] ")" [ "->" type ] block function-parameters = function-parameter *( "," function-parameter ) [ "," ] function-parameter = [ %s"const" ] identifier ":" type declaration = function-declaration file = *declaration ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Format String Grammar ; --------------------- not-brace = %x0-7A / %x7C / %x7E-10FFFF ; anything but { or } format-string-container = "{}" format-string-open-brace = "{{" format-string-close-brace = "}}" format-string-element = not-brace / format-string-container / format-string-open-brace / format-string-close-brace format-string = *format-string-element