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
|
# Parser
A parser takes an array of tokens (produced by the scanner) in input and
returns a node representing a syntax tree. A node is an object
containing a kind, the corresponding token and the ordered references to
descendent nodes.
```mermaid
graph LR
s[ ] --> |source| a(scanner)
--> |tokens| b(parser)
--> |AST| c[ ]
subgraph parser
b
end
style s height:0px;
style c height:0px;
```
A goal is to make the parser generic enough so it can generate syntax
trees for most of existing programming languages (no claim of generality
yet), provided a small set of generating rules per language, and a small
set of validating rules (yet to be defined) to detect invalid
constructs.
The input tokens are particular in the sense that they include classical
lexical items such as words, separators, numbers, but also strings and
nested blocks, which are resolved at scanning stage rather than parsing
stage. See the scanner for more details.
The language specification includes the following:
- a scanner specification, to produce the set of possible tokens.
- a map of node specification per token name. The node specification
defines some parameters influing how the tree is generated.
## Development status
A successful test must be provided to check the status.
- [x] binary operator expressions
- [x] unary operator (prefix) expressions
- [ ] unary operator (suffix) expressions
- [x] operator precedence rules
- [x] parenthesis in expressions
- [x] call expressions
- [ ] nested calls
- [x] index expressions
- [x] single assignments
- [ ] multi assignments
- [x] simple `if` statement (no `else`)
- [ ] full `if` statement (including `else`, `else if`)
- [x] init expressions in `if` statements
- [x] statement blocks
- [x] comments
- [ ] for statement
- [ ] switch statement
- [ ] select statement
- [x] return statement
- [x] function declaration
- [ ] method declaration
- [ ] anonymous functions (closures)
- [ ] type declaration
- [ ] var, const, type single declaration
- [ ] var, const, type multi declaration
- [ ] type parametric expressions
- [x] literal numbers (see scanner)
- [x] literal strings
- [ ] composite literal
- [ ] import statements
- [ ] go.mod syntax
|