Skip to content

Commit 7ada241

Browse files
committed
Add: function & call parsing
1 parent 564fcaf commit 7ada241

File tree

6 files changed

+139
-10
lines changed

6 files changed

+139
-10
lines changed

config/parser.json

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@
9090
{
9191
"validate_data": {
9292
"methods": {
93-
"check_min_tokens_length": {
94-
"min_length": 3
93+
"check_fixed_tokens_length": {
94+
"length": 3
9595
},
9696
"check_tokens_types": {
9797
"types": [
@@ -183,6 +183,84 @@
183183
}
184184
}
185185
]
186+
},
187+
"FuncNode": {
188+
"parser_class": "fastpy.parser.node_parsers.UniversalNodeParser",
189+
"node_class": "fastpy.parser.nodes.FuncNode",
190+
"cases": [
191+
{
192+
"validate_data": {
193+
"methods": {
194+
"check_min_tokens_length": {
195+
"min_length": 5
196+
},
197+
"check_tokens_types": {
198+
"types": [
199+
"operator",
200+
"identifier",
201+
"start_parenthesis"
202+
]
203+
},
204+
"check_tokens_names": {
205+
"names": [
206+
"function"
207+
]
208+
}
209+
}
210+
},
211+
"parse_data": {
212+
"identifier": {
213+
"index": 1
214+
},
215+
"arguments": {
216+
"parser_class": "fastpy.parser.node_parsers.ArgumentNodesParser",
217+
"possible_node_classes": [
218+
"fastpy.parser.nodes.AssignNode"
219+
],
220+
"tokens_slice": {
221+
"start_index": 3
222+
}
223+
}
224+
}
225+
}
226+
]
227+
},
228+
"CallNode": {
229+
"parser_class": "fastpy.parser.node_parsers.UniversalNodeParser",
230+
"node_class": "fastpy.parser.nodes.CallNode",
231+
"cases": [
232+
{
233+
"validate_data": {
234+
"methods": {
235+
"check_min_tokens_length": {
236+
"min_length": 3
237+
},
238+
"check_tokens_types": {
239+
"types": [
240+
"identifier",
241+
"start_parenthesis"
242+
]
243+
}
244+
}
245+
},
246+
"parse_data": {
247+
"identifier": {
248+
"index": 0
249+
},
250+
"arguments": {
251+
"parser_class": "fastpy.parser.node_parsers.ArgumentNodesParser",
252+
"possible_node_classes": [
253+
"fastpy.parser.nodes.ValueNode",
254+
"fastpy.parser.nodes.VariableNode",
255+
"fastpy.parser.nodes.CallNode"
256+
],
257+
"tokens_slice": {
258+
"start_index": 2
259+
}
260+
}
261+
}
262+
}
263+
]
186264
}
187265
}
188266
}

fastpy/lexer/tokens.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def __repr__(self):
5656
def code_from_tokens(tokens: list[BaseToken] | tuple[BaseToken]):
5757
code = ''
5858
for token in tokens:
59-
code += token.text
59+
code += token.text + ' '
6060
return code
6161

6262

fastpy/parser/node_parsers.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,18 @@ def parse(self,
2020
tokens: list[BaseToken],
2121
parse_node_clb: callable,
2222
supposed_node_type: type[BaseNode],
23-
**extra_data) -> BaseNode: ...
23+
**extra_data) -> BaseNode | list[BaseNode]: ...
2424

2525

2626
@singleton
2727
class UniversalNodeParser(BaseNodeParser):
28-
parses = (AssignNode,)
28+
parses = (AssignNode, FuncNode, CallNode, ValueNode, VariableNode)
2929

3030
def validate(self,
3131
tokens: list[BaseToken],
3232
supposed_node_type: type[BaseNode],
3333
**extra_data) -> bool:
34+
3435
methods = extra_data.get('methods')
3536
if not methods:
3637
return False
@@ -41,6 +42,7 @@ def validate(self,
4142
**method_kwargs
4243
):
4344
return False
45+
4446
return True
4547

4648
@staticmethod
@@ -77,6 +79,7 @@ def parse(self,
7779
supposed_node_type: type[BaseNode],
7880
parse_node_clb: callable,
7981
**extra_data) -> BaseNode:
82+
8083
node_arguments = {}
8184
for key, value_data in extra_data.items():
8285
node_arguments.update({
@@ -226,3 +229,35 @@ def parse(self,
226229
operator=operator,
227230
right_operand=right_operand
228231
)
232+
233+
234+
@singleton
235+
class ArgumentNodesParser(BaseNodeParser):
236+
def validate(self,
237+
tokens: list[BaseToken],
238+
supposed_node_type: type[BaseNode],
239+
**extra_data) -> bool:
240+
return True
241+
242+
def parse(self,
243+
tokens: list[BaseToken],
244+
parse_node_clb: callable,
245+
supposed_node_type: type[BaseNode],
246+
**extra_data) -> BaseNode | list[BaseNode]:
247+
248+
if tokens[0].type == TokenTypes.end_parenthesis:
249+
return []
250+
251+
arguments = []
252+
expr_tokens = []
253+
for token in tokens:
254+
if token.type == TokenTypes.comma:
255+
node = parse_node_clb(expr_tokens)
256+
arguments.append(node)
257+
expr_tokens.clear()
258+
continue
259+
elif token.type == TokenTypes.end_parenthesis:
260+
node = parse_node_clb(expr_tokens)
261+
arguments.append(node)
262+
return arguments
263+
expr_tokens.append(token)

fastpy/parser/nodes.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,22 +73,34 @@ def __init__(self,
7373
return_type: BaseToken = None):
7474
self.identifier = identifier
7575
self.arguments = arguments or []
76-
self._body = body or []
76+
self.body = body or []
7777
self.return_type = return_type
7878

7979
@property
8080
def line(self) -> int:
8181
return self.identifier.line
8282

8383

84+
class CallNode(BasicNode, PrintableNode):
85+
def __init__(self,
86+
identifier: BaseToken,
87+
arguments: list[BaseNode] = None):
88+
self.identifier = identifier
89+
self.arguments = arguments or []
90+
91+
@property
92+
def line(self) -> int:
93+
return self.identifier.line
94+
95+
8496
class IfNode(NodeWithBody, PrintableNode):
8597
def __init__(self,
8698
condition: list[BaseNode] = None,
8799
body: list[BaseNode] = None,
88100
elif_cases: list = None,
89101
else_body: list[BaseNode] = None):
90102
self.condition = condition
91-
self._body = body or []
103+
self.body = body or []
92104
self.elif_cases: list[IfNode.__init__] = elif_cases
93105
self.else_body = else_body
94106

fastpy/parser/parsers.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def _detect_struct_start(self, node: BaseNode, level: int):
9191
if isinstance(node, NodeWithBody):
9292
self._current_struct = Structure(
9393
node=node,
94-
level=level
94+
level=level + 4
9595
)
9696
self._structs.append(self._current_struct)
9797

@@ -104,8 +104,6 @@ def _parse_expression(self, expr_tokens: list[BaseToken], expr_level: int):
104104

105105
node = self._parse_node(expr_tokens)
106106

107-
self._detect_struct_start(node, expr_level)
108-
109107
if self._within_struct(level=expr_level):
110108
self._current_struct.push_node(node=node)
111109
else:
@@ -119,6 +117,8 @@ def _parse_expression(self, expr_tokens: list[BaseToken], expr_level: int):
119117
else:
120118
self._current_struct = None
121119

120+
self._detect_struct_start(node, expr_level)
121+
122122
@Logger.info('Start parsing...', ending_message='Parsing completed in {time}')
123123
# @Logger.catch_errors()
124124
def parse(self) -> BaseAST:

main.fpy

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,7 @@ c: int
66

77
d = a
88
e = (20 - 10) + (d + 20) + a
9+
10+
11+
fun world(a: int, b: bool, c: str) -> null:
12+
log('World')

0 commit comments

Comments
 (0)