Skip to content

Commit 11785e3

Browse files
committed
support parse ecomposite query
1 parent 79196d9 commit 11785e3

8 files changed

+286
-236
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ __pycache__
33
.vscode
44
.lh
55
test.py
6+
venv/
67

78
build/
89
*.egg-info

ic/candid.py

+2
Original file line numberDiff line numberDiff line change
@@ -1014,6 +1014,8 @@ def _encodeAnnotation(self, ann: str):
10141014
return int.to_bytes(1, 1, byteorder='big')
10151015
elif ann == 'oneway':
10161016
return int.to_bytes(2, 1, byteorder='big')
1017+
elif ann == "composite_query":
1018+
return int.to_bytes(3, 1, byteorder='big')
10171019
else:
10181020
raise ValueError('Illeagal function annotation')
10191021

ic/canister.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def __call__(self, *args, **kwargs):
5353
arguments.append({"type": self.args[i], "value": arg})
5454

5555
effective_cansiter_id = args[0]['canister_id'] if self.canister_id == 'aaaaa-aa' and len(args) > 0 and type(args[0]) == dict and 'canister_id' in args[0] else self.canister_id
56-
if self.anno == 'query':
56+
if self.anno == 'query' or self.anno == 'composite_query':
5757
res = self.agent.query_raw(
5858
self.canister_id,
5959
self.name,
@@ -93,7 +93,7 @@ async def __call__(self, *args, **kwargs):
9393
arguments.append({"type": self.args[i], "value": arg})
9494

9595
effective_cansiter_id = args[0]['canister_id'] if self.canister_id == 'aaaaa-aa' and len(args) > 0 and type(args[0]) == dict and 'canister_id' in args[0] else self.canister_id
96-
if self.anno == 'query':
96+
if self.anno == 'query' or self.anno == 'composite_query':
9797
res = await self.agent.query_raw_async(
9898
self.canister_id,
9999
self.name,

ic/parser/DIDLexer.py

+153-144
Large diffs are not rendered by default.

ic/parser/DIDParser.py

+116-89
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111

1212
def serializedATN():
1313
with StringIO() as buf:
14-
buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\32")
15-
buf.write("\u00b4\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7")
14+
buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\33")
15+
buf.write("\u00b5\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7")
1616
buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16")
1717
buf.write("\t\16\4\17\t\17\4\20\t\20\3\2\7\2\"\n\2\f\2\16\2%\13\2")
1818
buf.write("\3\2\5\2(\n\2\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\5\4\62\n")
@@ -26,59 +26,61 @@ def serializedATN():
2626
buf.write("\3\13\3\13\3\13\5\13\u008c\n\13\3\f\3\f\3\f\3\f\5\f\u0092")
2727
buf.write("\n\f\3\r\3\r\3\r\3\r\3\r\3\r\5\r\u009a\n\r\3\16\3\16\3")
2828
buf.write("\16\7\16\u009f\n\16\f\16\16\16\u00a2\13\16\3\16\5\16\u00a5")
29-
buf.write("\n\16\3\16\3\16\3\16\5\16\u00aa\n\16\3\17\3\17\5\17\u00ae")
30-
buf.write("\n\17\3\20\3\20\3\20\3\20\3\20\2\2\21\2\4\6\b\n\f\16\20")
31-
buf.write("\22\24\26\30\32\34\36\2\2\2\u00bf\2#\3\2\2\2\4)\3\2\2")
32-
buf.write("\2\6/\3\2\2\2\b=\3\2\2\2\nK\3\2\2\2\fO\3\2\2\2\16y\3\2")
33-
buf.write("\2\2\20\177\3\2\2\2\22\u0085\3\2\2\2\24\u008b\3\2\2\2")
34-
buf.write("\26\u008d\3\2\2\2\30\u0099\3\2\2\2\32\u00a9\3\2\2\2\34")
35-
buf.write("\u00ad\3\2\2\2\36\u00af\3\2\2\2 \"\5\4\3\2! \3\2\2\2\"")
36-
buf.write("%\3\2\2\2#!\3\2\2\2#$\3\2\2\2$\'\3\2\2\2%#\3\2\2\2&(\5")
37-
buf.write("\6\4\2\'&\3\2\2\2\'(\3\2\2\2(\3\3\2\2\2)*\7\6\2\2*+\7")
38-
buf.write("\21\2\2+,\7\31\2\2,-\5\n\6\2-.\7\30\2\2.\5\3\2\2\2/\61")
39-
buf.write("\7\17\2\2\60\62\7\21\2\2\61\60\3\2\2\2\61\62\3\2\2\2\62")
40-
buf.write("\63\3\2\2\2\63\67\7\27\2\2\64\65\5\30\r\2\65\66\7\26\2")
41-
buf.write("\2\668\3\2\2\2\67\64\3\2\2\2\678\3\2\2\28;\3\2\2\29<\5")
42-
buf.write("\b\5\2:<\7\21\2\2;9\3\2\2\2;:\3\2\2\2<\7\3\2\2\2=C\7\24")
43-
buf.write("\2\2>?\5\36\20\2?@\7\30\2\2@B\3\2\2\2A>\3\2\2\2BE\3\2")
44-
buf.write("\2\2CA\3\2\2\2CD\3\2\2\2DF\3\2\2\2EC\3\2\2\2FG\7\25\2")
45-
buf.write("\2G\t\3\2\2\2HL\7\21\2\2IL\7\t\2\2JL\5\f\7\2KH\3\2\2\2")
46-
buf.write("KI\3\2\2\2KJ\3\2\2\2L\13\3\2\2\2MP\5\16\b\2NP\5\24\13")
47-
buf.write("\2OM\3\2\2\2ON\3\2\2\2P\r\3\2\2\2QR\7\13\2\2Rz\5\n\6\2")
48-
buf.write("ST\7\f\2\2Tz\5\n\6\2UV\7\r\2\2VW\7\24\2\2Wz\7\25\2\2X")
49-
buf.write("Y\7\r\2\2YZ\7\24\2\2Z_\5\20\t\2[\\\7\30\2\2\\^\5\20\t")
50-
buf.write("\2][\3\2\2\2^a\3\2\2\2_]\3\2\2\2_`\3\2\2\2`c\3\2\2\2a")
51-
buf.write("_\3\2\2\2bd\7\30\2\2cb\3\2\2\2cd\3\2\2\2de\3\2\2\2ef\7")
52-
buf.write("\25\2\2fz\3\2\2\2gh\7\16\2\2hi\7\24\2\2iz\7\25\2\2jk\7")
53-
buf.write("\16\2\2kl\7\24\2\2lq\5\22\n\2mn\7\30\2\2np\5\22\n\2om")
54-
buf.write("\3\2\2\2ps\3\2\2\2qo\3\2\2\2qr\3\2\2\2ru\3\2\2\2sq\3\2")
55-
buf.write("\2\2tv\7\30\2\2ut\3\2\2\2uv\3\2\2\2vw\3\2\2\2wx\7\25\2")
56-
buf.write("\2xz\3\2\2\2yQ\3\2\2\2yS\3\2\2\2yU\3\2\2\2yX\3\2\2\2y")
57-
buf.write("g\3\2\2\2yj\3\2\2\2z\17\3\2\2\2{|\7\21\2\2|}\7\27\2\2")
58-
buf.write("}\u0080\5\n\6\2~\u0080\5\n\6\2\177{\3\2\2\2\177~\3\2\2")
59-
buf.write("\2\u0080\21\3\2\2\2\u0081\u0082\7\21\2\2\u0082\u0083\7")
60-
buf.write("\27\2\2\u0083\u0086\5\n\6\2\u0084\u0086\7\21\2\2\u0085")
61-
buf.write("\u0081\3\2\2\2\u0085\u0084\3\2\2\2\u0086\23\3\2\2\2\u0087")
62-
buf.write("\u0088\7\20\2\2\u0088\u008c\5\26\f\2\u0089\u008a\7\17")
63-
buf.write("\2\2\u008a\u008c\5\b\5\2\u008b\u0087\3\2\2\2\u008b\u0089")
64-
buf.write("\3\2\2\2\u008c\25\3\2\2\2\u008d\u008e\5\30\r\2\u008e\u008f")
65-
buf.write("\7\26\2\2\u008f\u0091\5\30\r\2\u0090\u0092\5\34\17\2\u0091")
66-
buf.write("\u0090\3\2\2\2\u0091\u0092\3\2\2\2\u0092\27\3\2\2\2\u0093")
67-
buf.write("\u0094\7\22\2\2\u0094\u009a\7\23\2\2\u0095\u0096\7\22")
68-
buf.write("\2\2\u0096\u0097\5\32\16\2\u0097\u0098\7\23\2\2\u0098")
69-
buf.write("\u009a\3\2\2\2\u0099\u0093\3\2\2\2\u0099\u0095\3\2\2\2")
70-
buf.write("\u009a\31\3\2\2\2\u009b\u00a0\5\n\6\2\u009c\u009d\7\32")
71-
buf.write("\2\2\u009d\u009f\5\n\6\2\u009e\u009c\3\2\2\2\u009f\u00a2")
72-
buf.write("\3\2\2\2\u00a0\u009e\3\2\2\2\u00a0\u00a1\3\2\2\2\u00a1")
73-
buf.write("\u00a4\3\2\2\2\u00a2\u00a0\3\2\2\2\u00a3\u00a5\7\32\2")
74-
buf.write("\2\u00a4\u00a3\3\2\2\2\u00a4\u00a5\3\2\2\2\u00a5\u00aa")
75-
buf.write("\3\2\2\2\u00a6\u00a7\7\21\2\2\u00a7\u00a8\7\27\2\2\u00a8")
76-
buf.write("\u00aa\5\n\6\2\u00a9\u009b\3\2\2\2\u00a9\u00a6\3\2\2\2")
77-
buf.write("\u00aa\33\3\2\2\2\u00ab\u00ae\7\7\2\2\u00ac\u00ae\7\b")
78-
buf.write("\2\2\u00ad\u00ab\3\2\2\2\u00ad\u00ac\3\2\2\2\u00ae\35")
79-
buf.write("\3\2\2\2\u00af\u00b0\7\21\2\2\u00b0\u00b1\7\27\2\2\u00b1")
80-
buf.write("\u00b2\5\26\f\2\u00b2\37\3\2\2\2\30#\'\61\67;CKO_cquy")
81-
buf.write("\177\u0085\u008b\u0091\u0099\u00a0\u00a4\u00a9\u00ad")
29+
buf.write("\n\16\3\16\3\16\3\16\5\16\u00aa\n\16\3\17\3\17\3\17\5")
30+
buf.write("\17\u00af\n\17\3\20\3\20\3\20\3\20\3\20\2\2\21\2\4\6\b")
31+
buf.write("\n\f\16\20\22\24\26\30\32\34\36\2\2\2\u00c1\2#\3\2\2\2")
32+
buf.write("\4)\3\2\2\2\6/\3\2\2\2\b=\3\2\2\2\nK\3\2\2\2\fO\3\2\2")
33+
buf.write("\2\16y\3\2\2\2\20\177\3\2\2\2\22\u0085\3\2\2\2\24\u008b")
34+
buf.write("\3\2\2\2\26\u008d\3\2\2\2\30\u0099\3\2\2\2\32\u00a9\3")
35+
buf.write("\2\2\2\34\u00ae\3\2\2\2\36\u00b0\3\2\2\2 \"\5\4\3\2! ")
36+
buf.write("\3\2\2\2\"%\3\2\2\2#!\3\2\2\2#$\3\2\2\2$\'\3\2\2\2%#\3")
37+
buf.write("\2\2\2&(\5\6\4\2\'&\3\2\2\2\'(\3\2\2\2(\3\3\2\2\2)*\7")
38+
buf.write("\6\2\2*+\7\22\2\2+,\7\32\2\2,-\5\n\6\2-.\7\31\2\2.\5\3")
39+
buf.write("\2\2\2/\61\7\20\2\2\60\62\7\22\2\2\61\60\3\2\2\2\61\62")
40+
buf.write("\3\2\2\2\62\63\3\2\2\2\63\67\7\30\2\2\64\65\5\30\r\2\65")
41+
buf.write("\66\7\27\2\2\668\3\2\2\2\67\64\3\2\2\2\678\3\2\2\28;\3")
42+
buf.write("\2\2\29<\5\b\5\2:<\7\22\2\2;9\3\2\2\2;:\3\2\2\2<\7\3\2")
43+
buf.write("\2\2=C\7\25\2\2>?\5\36\20\2?@\7\31\2\2@B\3\2\2\2A>\3\2")
44+
buf.write("\2\2BE\3\2\2\2CA\3\2\2\2CD\3\2\2\2DF\3\2\2\2EC\3\2\2\2")
45+
buf.write("FG\7\26\2\2G\t\3\2\2\2HL\7\22\2\2IL\7\n\2\2JL\5\f\7\2")
46+
buf.write("KH\3\2\2\2KI\3\2\2\2KJ\3\2\2\2L\13\3\2\2\2MP\5\16\b\2")
47+
buf.write("NP\5\24\13\2OM\3\2\2\2ON\3\2\2\2P\r\3\2\2\2QR\7\f\2\2")
48+
buf.write("Rz\5\n\6\2ST\7\r\2\2Tz\5\n\6\2UV\7\16\2\2VW\7\25\2\2W")
49+
buf.write("z\7\26\2\2XY\7\16\2\2YZ\7\25\2\2Z_\5\20\t\2[\\\7\31\2")
50+
buf.write("\2\\^\5\20\t\2][\3\2\2\2^a\3\2\2\2_]\3\2\2\2_`\3\2\2\2")
51+
buf.write("`c\3\2\2\2a_\3\2\2\2bd\7\31\2\2cb\3\2\2\2cd\3\2\2\2de")
52+
buf.write("\3\2\2\2ef\7\26\2\2fz\3\2\2\2gh\7\17\2\2hi\7\25\2\2iz")
53+
buf.write("\7\26\2\2jk\7\17\2\2kl\7\25\2\2lq\5\22\n\2mn\7\31\2\2")
54+
buf.write("np\5\22\n\2om\3\2\2\2ps\3\2\2\2qo\3\2\2\2qr\3\2\2\2ru")
55+
buf.write("\3\2\2\2sq\3\2\2\2tv\7\31\2\2ut\3\2\2\2uv\3\2\2\2vw\3")
56+
buf.write("\2\2\2wx\7\26\2\2xz\3\2\2\2yQ\3\2\2\2yS\3\2\2\2yU\3\2")
57+
buf.write("\2\2yX\3\2\2\2yg\3\2\2\2yj\3\2\2\2z\17\3\2\2\2{|\7\22")
58+
buf.write("\2\2|}\7\30\2\2}\u0080\5\n\6\2~\u0080\5\n\6\2\177{\3\2")
59+
buf.write("\2\2\177~\3\2\2\2\u0080\21\3\2\2\2\u0081\u0082\7\22\2")
60+
buf.write("\2\u0082\u0083\7\30\2\2\u0083\u0086\5\n\6\2\u0084\u0086")
61+
buf.write("\7\22\2\2\u0085\u0081\3\2\2\2\u0085\u0084\3\2\2\2\u0086")
62+
buf.write("\23\3\2\2\2\u0087\u0088\7\21\2\2\u0088\u008c\5\26\f\2")
63+
buf.write("\u0089\u008a\7\20\2\2\u008a\u008c\5\b\5\2\u008b\u0087")
64+
buf.write("\3\2\2\2\u008b\u0089\3\2\2\2\u008c\25\3\2\2\2\u008d\u008e")
65+
buf.write("\5\30\r\2\u008e\u008f\7\27\2\2\u008f\u0091\5\30\r\2\u0090")
66+
buf.write("\u0092\5\34\17\2\u0091\u0090\3\2\2\2\u0091\u0092\3\2\2")
67+
buf.write("\2\u0092\27\3\2\2\2\u0093\u0094\7\23\2\2\u0094\u009a\7")
68+
buf.write("\24\2\2\u0095\u0096\7\23\2\2\u0096\u0097\5\32\16\2\u0097")
69+
buf.write("\u0098\7\24\2\2\u0098\u009a\3\2\2\2\u0099\u0093\3\2\2")
70+
buf.write("\2\u0099\u0095\3\2\2\2\u009a\31\3\2\2\2\u009b\u00a0\5")
71+
buf.write("\n\6\2\u009c\u009d\7\33\2\2\u009d\u009f\5\n\6\2\u009e")
72+
buf.write("\u009c\3\2\2\2\u009f\u00a2\3\2\2\2\u00a0\u009e\3\2\2\2")
73+
buf.write("\u00a0\u00a1\3\2\2\2\u00a1\u00a4\3\2\2\2\u00a2\u00a0\3")
74+
buf.write("\2\2\2\u00a3\u00a5\7\33\2\2\u00a4\u00a3\3\2\2\2\u00a4")
75+
buf.write("\u00a5\3\2\2\2\u00a5\u00aa\3\2\2\2\u00a6\u00a7\7\22\2")
76+
buf.write("\2\u00a7\u00a8\7\30\2\2\u00a8\u00aa\5\n\6\2\u00a9\u009b")
77+
buf.write("\3\2\2\2\u00a9\u00a6\3\2\2\2\u00aa\33\3\2\2\2\u00ab\u00af")
78+
buf.write("\7\7\2\2\u00ac\u00af\7\b\2\2\u00ad\u00af\7\t\2\2\u00ae")
79+
buf.write("\u00ab\3\2\2\2\u00ae\u00ac\3\2\2\2\u00ae\u00ad\3\2\2\2")
80+
buf.write("\u00af\35\3\2\2\2\u00b0\u00b1\7\22\2\2\u00b1\u00b2\7\30")
81+
buf.write("\2\2\u00b2\u00b3\5\26\f\2\u00b3\37\3\2\2\2\30#\'\61\67")
82+
buf.write(";CKO_cquy\177\u0085\u008b\u0091\u0099\u00a0\u00a4\u00a9")
83+
buf.write("\u00ae")
8284
return buf.getvalue()
8385

8486

@@ -93,16 +95,16 @@ class DIDParser ( Parser ):
9395
sharedContextCache = PredictionContextCache()
9496

9597
literalNames = [ "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
96-
"'type'", "'query'", "'oneway'", "<INVALID>", "<INVALID>",
97-
"'opt'", "'vec'", "'record'", "'variant'", "'service'",
98-
"'func'", "<INVALID>", "'('", "')'", "'{'", "'}'",
99-
"'->'", "':'", "';'", "'='", "','" ]
98+
"'type'", "'query'", "'composite_query'", "'oneway'",
99+
"<INVALID>", "<INVALID>", "'opt'", "'vec'", "'record'",
100+
"'variant'", "'service'", "'func'", "<INVALID>", "'('",
101+
"')'", "'{'", "'}'", "'->'", "':'", "';'", "'='", "','" ]
100102

101103
symbolicNames = [ "<INVALID>", "BlockComment", "LineComment", "S", "Type",
102-
"Query", "Oneway", "PrimType", "NumType", "OPT", "VEC",
103-
"RECORD", "VARIANT", "Service", "FUNC", "Name", "LeftP",
104-
"RightP", "LeftB", "RightB", "Arrow", "Colon", "Semicolon",
105-
"Eq", "Comma" ]
104+
"Query", "CompositeQuery", "Oneway", "PrimType", "NumType",
105+
"OPT", "VEC", "RECORD", "VARIANT", "Service", "FUNC",
106+
"Name", "LeftP", "RightP", "LeftB", "RightB", "Arrow",
107+
"Colon", "Semicolon", "Eq", "Comma" ]
106108

107109
RULE_program = 0
108110
RULE_defination = 1
@@ -131,25 +133,26 @@ class DIDParser ( Parser ):
131133
S=3
132134
Type=4
133135
Query=5
134-
Oneway=6
135-
PrimType=7
136-
NumType=8
137-
OPT=9
138-
VEC=10
139-
RECORD=11
140-
VARIANT=12
141-
Service=13
142-
FUNC=14
143-
Name=15
144-
LeftP=16
145-
RightP=17
146-
LeftB=18
147-
RightB=19
148-
Arrow=20
149-
Colon=21
150-
Semicolon=22
151-
Eq=23
152-
Comma=24
136+
CompositeQuery=6
137+
Oneway=7
138+
PrimType=8
139+
NumType=9
140+
OPT=10
141+
VEC=11
142+
RECORD=12
143+
VARIANT=13
144+
Service=14
145+
FUNC=15
146+
Name=16
147+
LeftP=17
148+
RightP=18
149+
LeftB=19
150+
RightB=20
151+
Arrow=21
152+
Colon=22
153+
Semicolon=23
154+
Eq=24
155+
Comma=25
153156

154157
def __init__(self, input:TokenStream, output:TextIO = sys.stdout):
155158
super().__init__(input, output)
@@ -1234,7 +1237,7 @@ def functype(self):
12341237
self.state = 143
12351238
self._errHandler.sync(self)
12361239
_la = self._input.LA(1)
1237-
if _la==DIDParser.Query or _la==DIDParser.Oneway:
1240+
if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << DIDParser.Query) | (1 << DIDParser.CompositeQuery) | (1 << DIDParser.Oneway))) != 0):
12381241
self.state = 142
12391242
self.funcann()
12401243

@@ -1496,13 +1499,31 @@ def exitRule(self, listener:ParseTreeListener):
14961499
listener.exitOneway(self)
14971500

14981501

1502+
class CompositeQueryContext(FuncannContext):
1503+
1504+
def __init__(self, parser, ctx:ParserRuleContext): # actually a DIDParser.FuncannContext
1505+
super().__init__(parser)
1506+
self.copyFrom(ctx)
1507+
1508+
def CompositeQuery(self):
1509+
return self.getToken(DIDParser.CompositeQuery, 0)
1510+
1511+
def enterRule(self, listener:ParseTreeListener):
1512+
if hasattr( listener, "enterCompositeQuery" ):
1513+
listener.enterCompositeQuery(self)
1514+
1515+
def exitRule(self, listener:ParseTreeListener):
1516+
if hasattr( listener, "exitCompositeQuery" ):
1517+
listener.exitCompositeQuery(self)
1518+
1519+
14991520

15001521
def funcann(self):
15011522

15021523
localctx = DIDParser.FuncannContext(self, self._ctx, self.state)
15031524
self.enterRule(localctx, 26, self.RULE_funcann)
15041525
try:
1505-
self.state = 171
1526+
self.state = 172
15061527
self._errHandler.sync(self)
15071528
token = self._input.LA(1)
15081529
if token in [DIDParser.Query]:
@@ -1511,10 +1532,16 @@ def funcann(self):
15111532
self.state = 169
15121533
self.match(DIDParser.Query)
15131534
pass
1514-
elif token in [DIDParser.Oneway]:
1515-
localctx = DIDParser.OnewayContext(self, localctx)
1535+
elif token in [DIDParser.CompositeQuery]:
1536+
localctx = DIDParser.CompositeQueryContext(self, localctx)
15161537
self.enterOuterAlt(localctx, 2)
15171538
self.state = 170
1539+
self.match(DIDParser.CompositeQuery)
1540+
pass
1541+
elif token in [DIDParser.Oneway]:
1542+
localctx = DIDParser.OnewayContext(self, localctx)
1543+
self.enterOuterAlt(localctx, 3)
1544+
self.state = 171
15181545
self.match(DIDParser.Oneway)
15191546
pass
15201547
else:
@@ -1566,11 +1593,11 @@ def methodtype(self):
15661593
self.enterRule(localctx, 28, self.RULE_methodtype)
15671594
try:
15681595
self.enterOuterAlt(localctx, 1)
1569-
self.state = 173
1570-
self.match(DIDParser.Name)
15711596
self.state = 174
1572-
self.match(DIDParser.Colon)
1597+
self.match(DIDParser.Name)
15731598
self.state = 175
1599+
self.match(DIDParser.Colon)
1600+
self.state = 176
15741601
self.functype()
15751602
except RecognitionException as re:
15761603
localctx.exception = re

ic/parser/DIDParserListener.py

+9
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,15 @@ def exitQuery(self, ctx:DIDParser.QueryContext):
224224
pass
225225

226226

227+
# Enter a parse tree produced by DIDParser#CompositeQuery.
228+
def enterCompositeQuery(self, ctx:DIDParser.CompositeQueryContext):
229+
pass
230+
231+
# Exit a parse tree produced by DIDParser#CompositeQuery.
232+
def exitCompositeQuery(self, ctx:DIDParser.CompositeQueryContext):
233+
pass
234+
235+
227236
# Enter a parse tree produced by DIDParser#Oneway.
228237
def enterOneway(self, ctx:DIDParser.OnewayContext):
229238
pass

parser/DIDLexer.g4

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ Type: 'type';
1010

1111
Query: 'query';
1212

13+
CompositeQuery: 'composite_query';
14+
1315
Oneway: 'oneway';
1416

1517
PrimType:

parser/DIDParser.g4

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,6 @@ argtypes:
4747
datatype (Comma datatype)* Comma?
4848
| Name Colon datatype;
4949

50-
funcann: Query # Query | Oneway # Oneway;
50+
funcann: Query # Query | CompositeQuery #CompositeQuery | Oneway # Oneway;
5151

5252
methodtype: Name Colon functype;

0 commit comments

Comments
 (0)