@@ -9,10 +9,95 @@ by the lexer, but they separate tokens, e.g., identifiers or literals.
9
9
10
10
## Comments
11
11
12
+ Fram supports two kinds of comments: single-line and block comments. Comments
13
+ are treated similarly to whitespace: they are ignored by the lexer, but they
14
+ always separate tokens.
15
+
16
+ Single-line comments start with the ` # ` character and end with a new line or
17
+ the end of file.
18
+
19
+ Block comments are introduced by the sequence ` {# ` followed by any, possibly
20
+ empty, sequence * name* of valid identifier characters, operators, and
21
+ ` # ` characters. Such a block comment is terminated by the first occurrence of
22
+ * name* that is immediately followed by ` #} ` . More precisely, it can be
23
+ described by the following grammar.
24
+ ``` bnf
25
+ block-comment-name ::= { ident-char | op-char | "#" }
26
+ block-comment-start ::= "{#" block-comment-name
27
+ block-comment-end ::= block-comment-name "#}"
28
+ ```
29
+ Non-terminal symbols ` ident-char ` and ` op-char ` are defined later in this
30
+ chapter. At the comment opening, the longest consecutive sequence described by
31
+ ` block-comment-name ` is taken as the comment name. This name should be a suffix
32
+ of the name provided at comment closing. Comments using the same name cannot
33
+ be nested. This is not an issue in practice, since the programmer can always
34
+ choose a unique name to accomplish nesting.
35
+
36
+ By convention, single-line comments starting with ` ## ` and block comments
37
+ with a name starting with ` # ` are used as documentation comments, and can be
38
+ recognized by some external tools.
39
+
40
+ ### Examples
41
+
42
+ The following code contains some valid comments.
43
+ ```` fram
44
+ # This is a single-line comment.
45
+ {# This is a block comment. #}
46
+ {# Block comments
47
+ may span multiple lines.
48
+ #}
49
+ let id x = x # A single-line comment may appear at the end of a line.
50
+
51
+ let n {# A block comment may span a part of a single line. #} = 42
52
+ {#aaa
53
+ Comments cannot be nested,
54
+ {# but the programmer may choose the comment delimiters. #}
55
+ aaa#}
56
+
57
+ {#!a! Comment names may contain operators. !a!#}
58
+
59
+ {#abc
60
+ This comment is ended by `abc` immediately followed by `#}`,
61
+ even if the closing sequence is preceded by other characters.
62
+ zzabc#}
63
+
64
+ let {#
65
+ # This is not a single-line comment,
66
+ # because comments are not nested.
67
+ # This comment can be ended #} here = 13
68
+
69
+ ## This is a documentation comment.
70
+ let foo x = x
71
+
72
+ {## This is another documentation comment. ##}
73
+ let bar = foo
74
+
75
+ {###
76
+ Documentation comments can contain some code
77
+ ```
78
+ {## with another documentation comment (with a different name). #}}
79
+ let some_code = 42
80
+ ```
81
+ ###}
82
+ let baz = bar
83
+ ````
84
+
12
85
## Literals
13
86
87
+ ``` bnf
88
+ digit ::= "0"..."9"
89
+ lower-char ::= "a"..."z" | "_"
90
+ upper-char ::= "A"..."Z"
91
+ ident-char ::= lower-char | upper-char | digit | "'"
92
+ ```
93
+
14
94
## Keywords
15
95
16
96
## Identifiers
17
97
18
98
## Operators
99
+
100
+ ``` bnf
101
+ op-char ::= "<" | ">" | "&" | "$" | "?" | "!" | "@" | "^" | "+" | "-"
102
+ | "~" | "*" | "%" | ";" | "," | "=" | "|" | ":" | "." | "/"
103
+ ```
0 commit comments