-
Notifications
You must be signed in to change notification settings - Fork 7
/
samoralang.g4
52 lines (36 loc) · 1.81 KB
/
samoralang.g4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
grammar samoralang;
program : statement* ;
statement : variableDeclaration
| assignmentStatement
| printStatement
| readStatement
| ifStatement
| whileStatement
| functionDeclaration ;
variableDeclaration : 'let' Identifier '=' expression ;
assignmentStatement : Identifier '=' expression ;
printStatement : 'print' '(' expression ')' ;
readStatement : 'read' '(' Identifier ')' ;
ifStatement : 'if' '(' expression ')' '{' statement* '}' ('else' '{' statement* '}')? ;
whileStatement : 'while' '(' expression ')' '{' statement* '}' ;
functionDeclaration : 'let' Identifier '=' 'fn' '(' parameterList? ')' '{' statement* '}' ;
parameterList : Identifier (',' Identifier)* ;
expression : logicalOrExpression ;
logicalOrExpression : logicalAndExpression ('||' logicalAndExpression)* ;
logicalAndExpression : equalityExpression ('&&' equalityExpression)* ;
equalityExpression : relationalExpression ( ('==' | '!=') relationalExpression)* ;
relationalExpression : additiveExpression (('<' | '>' | '<=' | '>=') additiveExpression)* ;
additiveExpression : multiplicativeExpression (('+' | '-') multiplicativeExpression)* ;
multiplicativeExpression : unaryExpression (('*' | '/') unaryExpression)* ;
unaryExpression : ('+' | '-' | '!') unaryExpression
| primaryExpression ;
primaryExpression : Literal
| Identifier
| functionCall
| '(' expression ')' ;
functionCall : Identifier '(' argumentList? ')' ;
argumentList : expression (',' expression)* ;
Identifier : [a-zA-Z_][a-zA-Z0-9_]* ;
Literal : StringLiteral | NumericLiteral ;
StringLiteral : '"' .*? '"' ;
NumericLiteral : [0-9]+ ;