update grammar

This commit is contained in:
tocariimaa 2025-01-15 13:07:01 -03:00
parent 0f27e9965a
commit ad64813a67

View file

@ -1,8 +1,10 @@
; Rutile's grammar formal definition in ABNF ; Rutile's grammar formal definition in ABNF
; NOTE: terminal strings are case sensitive here ; NOTES:
; - terminal strings are by default case sensitive
; - alternatives are ordered
function-kind = "proc" / "iter" function-kind = "proc" / "iter"
proc-decl = function-kind "(" [proc-decl-args] ")" [ident] *stmt 'end' proc-decl = function-kind "(" [proc-decl-args] ")" ":" [ident] *stmt 'end'
proc-decl-args = symbol-type-pair *("," symbol-type-pair) proc-decl-args = symbol-type-pair *("," symbol-type-pair)
symbol-type-pair = ident ":" ident symbol-type-pair = ident ":" ident
@ -15,9 +17,9 @@ funcargs = expr-list
array-literal = "[" expr-list "]" array-literal = "[" expr-list "]"
expr-list = expr *("," expr) [","] ; Allows a trailling comma expr-list = expr *("," expr) [","] ; Allows a trailling comma
expr = number expr = number
expr =/ array-literal / array-literal
expr =/ function-call / function-call
pragma = "#" "[" "]" ; TODO pragma = "#" "[" "]" ; TODO
decorated-decl = pragma (proc-decl / symbol-decl) decorated-decl = pragma (proc-decl / symbol-decl)
@ -29,24 +31,24 @@ break-expr = "break" *expr
return-stmt = "return" *expr return-stmt = "return" *expr
yield-stmt = "yield" *expr yield-stmt = "yield" *expr
loop-control = "next" / break-expr loop-control = "next" / break-expr
stmt = proc-decl stmt = proc-decl
stmt =/ expr / expr
stmt =/ loop-control / loop-control
stmt =/ if-expr / if-expr
stmt =/ while-stmt / while-stmt
stmt =/ return-stmt / return-stmt
stmt =/ yield-stmt / yield-stmt
ident = (ALPHA / "_") *(ALPHA / DIGIT / "_" / "?" / "!") ident = (ALPHA / "_") *(ALPHA / DIGIT / "_" / "?" / "!")
; Identifier accounting for namespacing: std:io.print, aaa:bbb:ccc ; Identifier accounting for namespacing: std:io.print, aaa:bbb:ccc
ident-qualified = (ALPHA / "_") *(ALPHA / DIGIT / "_" / "?" / "!" / ":" / ".") ident-qualified = (ALPHA / "_") *(ALPHA / DIGIT / "_" / "?" / "!" / ":" / ".")
OCTDIGIT = %x30-37
number = 1*DIGIT ; Decimal number = 1*DIGIT ; Decimal
/ "0b" 1*("0" / "1") ; Binary / "0b" 1*("0" / "1") ; Binary
/ "0o" 1*(0-8) ; Octal / "0o" 1*OCTDIGIT ; Octal
/ "0x" 1*HEXDIGIT ; Hexadecimal / "0x" 1*HEXDIGIT ; Hexadecimal
byte = %x00-FF
escape = "\" ("\" / DQUOTE / "0" / "a" / "b" / "n" / "r" / "t" / ("x" 1*2HEXDIGIT)) escape = "\" ("\" / DQUOTE / "0" / "a" / "b" / "n" / "r" / "t" / ("x" 1*2HEXDIGIT))
character = byte / escape character = OCTET / escape
string-literal = DQUOTE *character DQUOTE string-literal = DQUOTE *character DQUOTE