-
Notifications
You must be signed in to change notification settings - Fork 4
/
scad.ungram
127 lines (83 loc) · 2.51 KB
/
scad.ungram
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Grammar for the OpenSCAD programming language.
//
// For information on how this file is used, see the original article from
// rust-analyzer:
//
// https://rust-analyzer.github.io/blog/2020/10/24/introducing-ungrammar.html
Package = Statement*
Statement =
Include
| Use
| AssignmentStatement
| NamedFunctionDefinition
| NamedModuleDefinition
| ModuleInstantiation
| IfStatement
| ForStatement
Include = 'include' 'file'
Use = 'use' 'file'
IfStatement = 'if' '(' Expr ')' Actions ( 'else' Actions )?
ForStatement = 'for' '(' Assignments ')' Actions
Actions =
Action
| BracedActions
BracedActions = '{' Action* '}'
Action =
AssignmentStatement
| ModuleInstantiation
| IfStatement
| ForStatement
AssignmentStatement = Assignment ';'
Expr =
Atom
| ListExpr
| RangeExpr
| UnaryExpr
| TernaryExpr
| ParenExpr
| ListComprehensionExpr
| BinExpr
Atom =
LiteralExpr
| LookupExpr
| IndexExpr
| FunctionCall
LiteralExpr = 'true' | 'false' | 'undef' | 'integer' | 'float' | 'string'
LookupExpr = 'ident' ('.' 'ident')*
TernaryExpr = Expr '?' Expr ':' Expr
IndexExpr = Expr '[' Expr ']'
ParenExpr = '(' Expr ')'
ListComprehensionExpr = '[' ForClause ']'
BinExpr = Expr (BinOp Expr)*
BinOp = '+' | '-' | '*' | '/' | '%' | '^' | '>=' | '>' | '==' | '!=' | '<=' | '<' | '&&' | '||'
UnaryExpr = UnaryOp Expr
UnaryOp = '!' | '+' | '-'
RangeExpr = RangeExprFromTo | RangeExprFromToStep
RangeExprFromTo = '[' Expr ':' Expr ']'
RangeExprFromToStep = '[' Expr ':' Expr ':' Expr ']'
ListExpr = '[' Expr (',' Expr)* ']'
ListComprehensionElement =
LetClause
| ForClause
| IfClause
ListComprehensionElementOrExpr = ListComprehensionElement | Expr
LetClause = 'let' '(' assignments:AssignmentsOpt ')' ListComprehensionElementOrExpr
ForClause = 'for' '(' assignments:Assignments ')' ListComprehensionElementOrExpr
IfClause = 'if' '(' condition:Expr ')' ListComprehensionElementOrExpr
NamedFunctionDefinition = 'function' 'ident' '(' params:Parameters? ')' '=' body:Expr ';'
NamedModuleDefinition = 'module' 'ident' '(' params:Parameters? ')' '{' body:Statement* '}'
FunctionCall = 'ident' '(' args:Arguments? ')'
ModuleInstantiation = 'ident' '(' args:Arguments? ')' Child
Children = Child*
Child =
';'
| BracedChildren
| ModuleInstantiation
BracedChildren = '{' Children '}'
Parameters = Parameter (',' Parameter)*
Parameter = variable:'ident' | Assignment
Arguments = Argument (',' Argument)*
Argument = Expr | Assignment
AssignmentsOpt = Assignments?
Assignments = Assignment (',' Assignment)*
Assignment = name:'ident' '=' value:Expr