Skip to content

Commit 9f33014

Browse files
committed
feat: 重构部分运算符语法规则
1 parent 17dd147 commit 9f33014

13 files changed

+1796
-2300
lines changed

antlr/OpenCML.g4

+50-67
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ lambdaExpr : modifiers? parentParams (':' typeExpr)? '=>' (bracedStmts | entityE
4848

4949
carrier : identRef | bracedIdents | bracketIdents ;
5050

51-
annotation : '@' primEntity ;
51+
annotation : '@' primaryExpr ;
5252
annotations : annotation+ ;
5353
modifiers : (INNER | OUTER | ATOMIC | STATIC)+ ;
5454

@@ -77,6 +77,7 @@ bracedIndexKVPairs : '{' indexKVPairs ','? '}' ; // for literal construction of
7777
bracketIdents : '[' identList? ','? ']' ; // for list unpacking
7878
bracketHomoValues : '[|' valueList? ','? '|]' ; // for literal construction of vector (variable length, homogeneous)
7979
bracketHeteValues : '[' valueList? ','? ']' ; // for literal construction of list (variable length, heterogeneous)
80+
memberAccess : '[' entityExpr ']' ;
8081

8182
parentParams : '(' pairedParams? ','? ')' ; // for functor parameters definition
8283
parentValues : '(' argumentList? ','? ')' ; // for functor arguments
@@ -86,84 +87,68 @@ parentHeteValues : '(' valueList? ','? ')' ; // for literal construction of
8687
angledParams : '<' pairedParams? ','? '>' ; // for functor super parameters definition
8788
angledValues : '<' argumentList? ','? '>' ; // for functor super arguments
8889

89-
primEntity
90-
: identRef
91-
| literal
92-
| bracedIndexKVPairs // for map
93-
| bracedHomoValues // for set
94-
| bracedPairedValues // for dict
95-
| bracketHeteValues // for list
96-
| bracketHomoValues // for vector
97-
| '(' entityExpr ')' // if there is only one entity, it will be recognized as a primary expression rather than a tuple
98-
| parentHeteValues // for tuple
99-
| parentHomoValues // for array
100-
| lambdaExpr ;
90+
entityExpr
91+
: ternaryExpr (('=' | '+=' | '-=' | '*=' | '/=' | '%=' | '^=' | '&=' | '|=') ternaryExpr)*
92+
;
10193

102-
memberAccess : '[' entityExpr ']' ;
94+
ternaryExpr
95+
: relationalExpr ('?' ternaryExpr ':' ternaryExpr)?
96+
;
10397

104-
entityLink : entityUnit | entityLink '->' entityUnit ;
105-
entityUnit : entityWith ((memberAccess | angledValues | parentValues) | annotation)* ;
106-
entityWith : primEntity | entityWith '.' primEntity ;
98+
logicalOrExpr
99+
: logicalAndExpr ('||' logicalAndExpr)*
100+
;
107101

108-
entityExpr
109-
: ternaryExpr
110-
| entityExpr '=' ternaryExpr
111-
| entityExpr '+=' ternaryExpr
112-
| entityExpr '-=' ternaryExpr
113-
| entityExpr '*=' ternaryExpr
114-
| entityExpr '/=' ternaryExpr
115-
| entityExpr '%=' ternaryExpr
116-
| entityExpr '^=' ternaryExpr
117-
| entityExpr '&=' ternaryExpr
118-
| entityExpr '|=' ternaryExpr
102+
logicalAndExpr
103+
: equalityExpr ('&&' equalityExpr)*
119104
;
120105

121-
ternaryExpr
122-
: relaExpr
123-
| relaExpr '?' ternaryExpr ':' ternaryExpr
106+
equalityExpr
107+
: relationalExpr (('==' | '!=') relationalExpr)*
124108
;
125109

126-
relaExpr
127-
: addExpr
128-
| relaExpr '<' addExpr
129-
| relaExpr '>' addExpr
130-
| relaExpr '<=' addExpr
131-
| relaExpr '>=' addExpr
132-
| relaExpr '==' addExpr
133-
| relaExpr '!=' addExpr
134-
| relaExpr '&&' addExpr
135-
| relaExpr '||' addExpr
110+
relationalExpr
111+
: additiveExpr (('<' | '>' | '<=' | '>=') additiveExpr)*
136112
;
137113

138-
addExpr
139-
: multiExpr
140-
| addExpr '+' multiExpr
141-
| addExpr '-' multiExpr
142-
| addExpr '&' multiExpr
143-
| addExpr '|' multiExpr
114+
additiveExpr
115+
: multiplicativeExpr (('+' | '-') multiplicativeExpr)*
144116
;
145117

146-
multiExpr
147-
: unaryExpr
148-
| multiExpr '^' unaryExpr
149-
| multiExpr '*' unaryExpr
150-
| multiExpr '/' unaryExpr
151-
| multiExpr '%' unaryExpr
152-
| multiExpr AS typeExpr
153-
| multiExpr IS typeExpr
118+
multiplicativeExpr
119+
: unaryExpr (('^' | '*' | '/' | '%' | AS | IS) unaryExpr)*
154120
;
155121

156122
unaryExpr
157-
: primExpr
158-
| '!' primExpr
159-
| '~' primExpr
123+
: linkExpr
124+
| ('!' | '~') linkExpr
125+
;
126+
127+
linkExpr
128+
: withExpr ('->' withExpr)*
129+
;
130+
131+
withExpr
132+
: annotatedExpr ('.' annotatedExpr)*
160133
;
161134

162-
primExpr
163-
: entityLink
164-
| '(' entityExpr ')'
135+
annotatedExpr
136+
: primaryExpr (memberAccess | parentValues | angledValues | annotation)*
165137
;
166138

139+
primaryExpr
140+
: identRef
141+
| literal
142+
| bracedIndexKVPairs // for map
143+
| bracedHomoValues // for set
144+
| bracedPairedValues // for dict
145+
| bracketHeteValues // for list
146+
| bracketHomoValues // for vector
147+
| '(' entityExpr ')' // if there is only one entity, it will be recognized as a primary expression rather than a tuple
148+
| parentHeteValues // for tuple
149+
| parentHomoValues // for array
150+
| lambdaExpr ;
151+
167152
literal
168153
: INTEGER UNIT?
169154
| REAL UNIT?
@@ -176,17 +161,15 @@ literal
176161
;
177162

178163
typeExpr
179-
: unaryType
180-
| typeExpr '&' unaryType
181-
| typeExpr '|' unaryType
164+
: arrayType (('&' | '|' | '^') arrayType)*
182165
;
183166

184-
unaryType
167+
arrayType
185168
: atomType ('[' INTEGER? ']')*
186169
;
187170

188171
atomType
189-
: primType
172+
: primaryType
190173
| structType
191174
| specialType
192175
| identRef
@@ -198,7 +181,7 @@ lambdaType
198181
: ('<' pairedParams? '>')? '(' pairedParams? ')' '=>' typeExpr
199182
;
200183

201-
primType
184+
primaryType
202185
: INTEGER_TYPE
203186
| INTEGER32_TYPE
204187
| INTEGER64_TYPE
File renamed without changes.

demo/feat/expr.cml

+12-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
1-
a b c(f) d;
2-
a->b->c->d;
3-
a b<v> c a->b->c;
4-
a->b a b a<e>->b;
1+
a->b[1]->c.e->d(a);
2+
a.b<v>@[a, b];
3+
c.a->b->c;
4+
a->b.b@(c, d);
5+
a<e>->b;
56
a(b, d(f)->e(g));
67
let a = d + (a + b) * c / 2;
8+
let powerOutput = true ? powerInput : Const<3`V`>;
9+
10+
// ternary expression
11+
let r = A ? B ? a : b : C ? c : d;
12+
13+
// operator precedence
14+
let result = a == 1 ? b : c = 4;

demo/feat/gir.txt

-22
This file was deleted.

src/antlr/OpenCML.interp

+22-20
Large diffs are not rendered by default.

src/antlr/OpenCML.tokens

+27-27
Original file line numberDiff line numberDiff line change
@@ -117,33 +117,33 @@ REAL=99
117117
'|)'=18
118118
'<'=19
119119
'>'=20
120-
'->'=21
121-
'.'=22
122-
'+='=23
123-
'-='=24
124-
'*='=25
125-
'/='=26
126-
'%='=27
127-
'^='=28
128-
'&='=29
129-
'|='=30
130-
'?'=31
131-
'<='=32
132-
'>='=33
133-
'=='=34
134-
'!='=35
135-
'&&'=36
136-
'||'=37
137-
'+'=38
138-
'-'=39
139-
'&'=40
140-
'|'=41
141-
'^'=42
142-
'*'=43
143-
'/'=44
144-
'%'=45
145-
'!'=46
146-
'~'=47
120+
'+='=21
121+
'-='=22
122+
'*='=23
123+
'/='=24
124+
'%='=25
125+
'^='=26
126+
'&='=27
127+
'|='=28
128+
'?'=29
129+
'||'=30
130+
'&&'=31
131+
'=='=32
132+
'!='=33
133+
'<='=34
134+
'>='=35
135+
'+'=36
136+
'-'=37
137+
'^'=38
138+
'*'=39
139+
'/'=40
140+
'%'=41
141+
'!'=42
142+
'~'=43
143+
'->'=44
144+
'.'=45
145+
'&'=46
146+
'|'=47
147147
';'=48
148148
'as'=49
149149
'is'=50

src/antlr/OpenCMLBaseVisitor.h

+22-14
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,10 @@ class OpenCMLBaseVisitor : public OpenCMLVisitor {
181181
return visitChildren(ctx);
182182
}
183183

184+
virtual std::any visitMemberAccess(OpenCMLParser::MemberAccessContext *ctx) override {
185+
return visitChildren(ctx);
186+
}
187+
184188
virtual std::any visitParentParams(OpenCMLParser::ParentParamsContext *ctx) override {
185189
return visitChildren(ctx);
186190
}
@@ -205,51 +209,55 @@ class OpenCMLBaseVisitor : public OpenCMLVisitor {
205209
return visitChildren(ctx);
206210
}
207211

208-
virtual std::any visitPrimEntity(OpenCMLParser::PrimEntityContext *ctx) override {
212+
virtual std::any visitEntityExpr(OpenCMLParser::EntityExprContext *ctx) override {
209213
return visitChildren(ctx);
210214
}
211215

212-
virtual std::any visitMemberAccess(OpenCMLParser::MemberAccessContext *ctx) override {
216+
virtual std::any visitTernaryExpr(OpenCMLParser::TernaryExprContext *ctx) override {
213217
return visitChildren(ctx);
214218
}
215219

216-
virtual std::any visitEntityLink(OpenCMLParser::EntityLinkContext *ctx) override {
220+
virtual std::any visitLogicalOrExpr(OpenCMLParser::LogicalOrExprContext *ctx) override {
217221
return visitChildren(ctx);
218222
}
219223

220-
virtual std::any visitEntityUnit(OpenCMLParser::EntityUnitContext *ctx) override {
224+
virtual std::any visitLogicalAndExpr(OpenCMLParser::LogicalAndExprContext *ctx) override {
221225
return visitChildren(ctx);
222226
}
223227

224-
virtual std::any visitEntityWith(OpenCMLParser::EntityWithContext *ctx) override {
228+
virtual std::any visitEqualityExpr(OpenCMLParser::EqualityExprContext *ctx) override {
225229
return visitChildren(ctx);
226230
}
227231

228-
virtual std::any visitEntityExpr(OpenCMLParser::EntityExprContext *ctx) override {
232+
virtual std::any visitRelationalExpr(OpenCMLParser::RelationalExprContext *ctx) override {
229233
return visitChildren(ctx);
230234
}
231235

232-
virtual std::any visitTernaryExpr(OpenCMLParser::TernaryExprContext *ctx) override {
236+
virtual std::any visitAdditiveExpr(OpenCMLParser::AdditiveExprContext *ctx) override {
233237
return visitChildren(ctx);
234238
}
235239

236-
virtual std::any visitRelaExpr(OpenCMLParser::RelaExprContext *ctx) override {
240+
virtual std::any visitMultiplicativeExpr(OpenCMLParser::MultiplicativeExprContext *ctx) override {
237241
return visitChildren(ctx);
238242
}
239243

240-
virtual std::any visitAddExpr(OpenCMLParser::AddExprContext *ctx) override {
244+
virtual std::any visitUnaryExpr(OpenCMLParser::UnaryExprContext *ctx) override {
241245
return visitChildren(ctx);
242246
}
243247

244-
virtual std::any visitMultiExpr(OpenCMLParser::MultiExprContext *ctx) override {
248+
virtual std::any visitLinkExpr(OpenCMLParser::LinkExprContext *ctx) override {
245249
return visitChildren(ctx);
246250
}
247251

248-
virtual std::any visitUnaryExpr(OpenCMLParser::UnaryExprContext *ctx) override {
252+
virtual std::any visitWithExpr(OpenCMLParser::WithExprContext *ctx) override {
253+
return visitChildren(ctx);
254+
}
255+
256+
virtual std::any visitAnnotatedExpr(OpenCMLParser::AnnotatedExprContext *ctx) override {
249257
return visitChildren(ctx);
250258
}
251259

252-
virtual std::any visitPrimExpr(OpenCMLParser::PrimExprContext *ctx) override {
260+
virtual std::any visitPrimaryExpr(OpenCMLParser::PrimaryExprContext *ctx) override {
253261
return visitChildren(ctx);
254262
}
255263

@@ -261,7 +269,7 @@ class OpenCMLBaseVisitor : public OpenCMLVisitor {
261269
return visitChildren(ctx);
262270
}
263271

264-
virtual std::any visitUnaryType(OpenCMLParser::UnaryTypeContext *ctx) override {
272+
virtual std::any visitArrayType(OpenCMLParser::ArrayTypeContext *ctx) override {
265273
return visitChildren(ctx);
266274
}
267275

@@ -273,7 +281,7 @@ class OpenCMLBaseVisitor : public OpenCMLVisitor {
273281
return visitChildren(ctx);
274282
}
275283

276-
virtual std::any visitPrimType(OpenCMLParser::PrimTypeContext *ctx) override {
284+
virtual std::any visitPrimaryType(OpenCMLParser::PrimaryTypeContext *ctx) override {
277285
return visitChildren(ctx);
278286
}
279287

0 commit comments

Comments
 (0)