]> git.kianting.info Git - clo/blob - parserRuleRefOnly.txt
add rule and find some issue
[clo] / parserRuleRefOnly.txt
1 let sqrtSum = (int x, int y) -> int {
2 let x2 = x * x;
3 let y2 = y * y;
4 return x2+y2;
5 }
6
7 let pi = 3.14159;
8 let _2p = (intToFLo 2) *. pi;
9
10 let c = if (2 == 2) then 2 else 3;
11
12 let aStr = "hello";
13
14 let rec fac = (int n)-> int {
15 if n == 0 then 1 else (fac (n - 1));};
16
17
18 type student = Student {int id, string name};
19
20 let alice = Student {id=20, name="Alice"};
21
22 alice.name = "Siobhan";
23
24 let customAnd = (@ 'a has age) ('a x, 'a y) => {'a > 'b};
25
26 type list 'a = (Cons 'a (List 'a)) | Nil;
27
28 import("alifbata.clo"); # 匯入檔案 alifbata #
29
30 t of import :== string -> Option string string
31 Error("string") | Ok("import aaa")
32 # 型別構造子統一大寫,型別小寫 #
33
34
35
36 PROG ::= (STMT | COMMENT | STMT_COMMENT)*
37 COMMENT ::= # COMMENT_INNER #
38 COMMENT_INNER ::= [^#]+
39 STMT ::= (TYPE_DEF | VAR_DEF | SET | EXPR ) ";"
40 TYPE_DEF ::= type ID "=" UNION
41 | type ID TYPE_VARS+ "=" UNIOM
42 TYPE_VARS = ' ID
43 UNION ::= (REC "|" UNION) | REC
44 REC ::= ID ( TYPES )
45 TYPES ::= TYPE+
46 TYPE ::= ID
47
48 EXPR ::= if SUB_EXPR then IF_BRANCH else IF_BRANCH | SUB_EXPR
49 IF_BRANCH ::= EXPR | { BLOCK }
50 SUB_EXPR ::= COMPAREE| COMPAREE (LE|GE|LT|GT|EQ|NE) EXPR
51 COMPAREE ::= FAC| (FAC(ADD | SUB) FAC)
52 FAC ::= APPLY | (APPLIER (MUL | DIV) APPLY)
53 APPLY ::= "(" ID APPLYEE* ")" | APPLYEE
54 APPLYEE ::= REF | CONST | EXPR | FUNC
55 * CONST ::= INT | STR | FLO | BOOL
56 BOOL ::= "true" | "false"
57 FUNC ::= FUNC_OPTION? ( ARGS? ) -> TYPE {BLOCK}
58 BLOCK ::= PROG (return ID |noReturn) ;
59
60 REF ::= VAR "." ID | VAR
61 VAR ::= ID
62 VAR_DEF ::= "let" VAR "=" EXPR
63 SET ::= VAR "=" EXPR
64 FUNC_OPTION ::= ( @ TYPE_HAS (, TYPE_HAS)* )
65 TYPE_HAS ::= TYPE_VAR "has" ID