34 lines
1.5 KiB
Markdown
34 lines
1.5 KiB
Markdown
# Грамматика (EBNF)
|
|
|
|
Упрощённая грамматика текущего парсера:
|
|
|
|
```
|
|
program = { statement } ;
|
|
statement = class | function | if | block | return | expression ";" ;
|
|
block = "{" { statement } "}" ;
|
|
class = "class" name "{" { declaration | function } "}" ;
|
|
function = "fn" name "(" [ parameters ] ")" [ type-name ] statement ;
|
|
parameters = parameter { "," parameter } ;
|
|
parameter = type-name name ;
|
|
return = "return" [ expression ] ";" ;
|
|
if = "if" "(" expression ")" statement [ "else" statement ] ;
|
|
expression = assignment ;
|
|
assignment = new-expression [ "=" assignment ] ;
|
|
new-expression = logical-or | "new" name ;
|
|
logical-or = logical-and { "||" logical-and } ;
|
|
logical-and = comparison { "&&" comparison } ;
|
|
comparison = term { compare-op term } ;
|
|
term = factor { ( "+" | "-" ) factor } ;
|
|
factor = power { ( "*" | "/" | "%" ) power } ;
|
|
power = unary [ "^" unary ] ;
|
|
unary = ( "+" | "-" | "!" ) unary | postfix ;
|
|
postfix = primary { call | member } ;
|
|
call = "(" [ expression { "," expression } ] ")" ;
|
|
member = "." name ;
|
|
primary = literal | declaration | name | "(" expression ")" ;
|
|
declaration = type-name name ;
|
|
type-name = builtin-type | name ;
|
|
```
|
|
|
|
`literal` включает строковый, числовой, булев и `null` литералы. Комментарии `// ...` и пробельные символы между токенами игнорируются.
|