-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathgrammar.txt
81 lines (71 loc) · 3.92 KB
/
grammar.txt
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
The followings are the grammar of Onion programming language like EBNF:
block_comment ::= '/*' ([^*])* '*' ('*' | ([^*/] ([^*])* '*'))* '/'
line_comment ::= '//' ([^\r\n])*
shell_comment ::= '#!' ([^\r\n])*
compile_unit ::= module? import? (
'class' | 'interface' | 'statement' | 'function' | 'global_var'
)+
module ::= 'module' id (. id)* ;
import ::= 'import' { (id (. id)+ ; | id = id (. id)+ ;)* }
access ::= 'public' | 'protected' | 'private'
modifier ::= 'final' | 'internal' | 'volatile' | 'synchronized' | 'static' | 'inherited'
type ::= primitive | id | '#<' id (. id)* '>' | type ('[]')+
primitive ::= 'Byte' | 'Short' | 'Char' | 'Int' | 'Long' | 'Float' | 'Double' | 'Boolean' | 'Unit'
class ::= modifier* 'class' id (':' type)? ('<:' type (, type)*)? {
(field | method | constructor)*
(access : (field | method | constructor)*)*
}
interface ::= modifier* 'interface' id ('<:' type (, type)*)? {
(id ('(' (var_decl (, var_decl)*)? ')')? (: type)? ;)*
}
field ::= modifier* ('forward')? field_id : type [= expression] ;
method ::= ['def'] modifier* id ( '(' (arg_list)? ')' )? (: type)? (; | block)
constructor ::= modifier* new ( '(' (arg_list)? ')' )? (: '(' [expression_list] ')' )? block
function ::= modifier* def id ( '(' (arg_list)? ')' )? (: type)? block
global_var ::= modifier* var id : type (= expression)? ;
statement ::= 'if' expression block [else block]
| 'select' expression { (case expr_list block)* [else block] }
| 'while' expression block
| 'for' (var_decl | expression_stmt) expression ; [expr] block
| 'foreach' var_decl 'in' expression block
| 'synchronized' expression block
| 'try' block ('rec' id : type block)* 'fin' block
| 'break' ;
| 'continue' ;
| 'return' [expression] ;
| 'throw' expression ;
| { statement* }
| ';'
| expression ;
| var_decl
| id : type (= expression)? ;
arg_list ::= id : type (, id : type)*
expression ::= expression binary_op expression
| expression assign_op expression
| unary_op expression
| expression ( . id ( '(' (expr_list)? ')' )? )*
| 'new' type '[' expression_list ']'
| 'new' type ( '(' (expression_list)? ')' )?
| type '::' id ( '(' (expression_list)? ')' )?
| expression ('[' expression ']')*
| '(' expression ')'
| id ( '(' (expression_list)? ')' )?
| expression 'is' type
| expression $ type
| # type . id ( '(' [arg_list] ')' )? block
| '[' (expression_list)? ']'
| 'this'
| 'true'
| 'false'
| 'null'
| <integer_literal>
| <float_literal
| <character_literal
| <string_literal
| <list_literal>
expression_list ::= expression (, expression)*
unary_op ::= ! | - | + | ~
binary_op ::= + | - | * | / | % | << || >> | >>> | ^ | & | '|' | < | > | <= | >= | == | != | === | !== | '||' | &&
assign_op ::= = | += | -= | *= | /= | %=
id ::= ([a-z] | [A-Z] | _) ([a-z] | [A-Z] | [0-9] | _)*
field_id ::= '@' id