Skip to content

Commit 228449c

Browse files
committed
new lua grammar
1 parent 1ebefcc commit 228449c

File tree

6 files changed

+261
-1846
lines changed

6 files changed

+261
-1846
lines changed

luaparser/ast.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ def parse(source: str) -> Chunk:
1919
lexer.addErrorListener(ConsoleErrorListener())
2020

2121
token_stream = CommonTokenStream(lexer, channel=Token.DEFAULT_CHANNEL)
22-
comments_token_stream = CommonTokenStream(lexer, channel=Token.DEFAULT_CHANNEL)
2322
parser = LuaParser(token_stream)
2423
parser.addErrorListener(ConsoleErrorListener())
2524
tree = parser.start_()
@@ -363,6 +362,14 @@ def visit(self, node):
363362
def visit(self, node):
364363
self._nodes.append(node)
365364

365+
@visitor(Comment)
366+
def visit(self, node):
367+
self._nodes.append(node)
368+
369+
@visitor(Attribute)
370+
def visit(self, node):
371+
self._nodes.append(node)
372+
366373

367374
class SyntaxException(Exception):
368375
pass

luaparser/astnodes.py

Lines changed: 68 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -25,30 +25,36 @@ class Node:
2525
"""
2626

2727
def __init__(
28-
self,
29-
name: str,
30-
comments: Comments = None,
31-
tokens: Optional[List[CommonToken]] = None,
28+
self,
29+
name: str,
30+
comments: Comments = None,
31+
first_token: Optional[CommonToken] = None,
32+
last_token: Optional[CommonToken] = None,
3233
):
3334
"""
3435
Args:
3536
name: The name of the node.
3637
comments: Optional comments.
37-
tokens: List of Antlr4 tokens composing the node.
38+
first_token: First Antlr token
39+
last_token: Last Antlr token
3840
"""
3941
if comments is None:
4042
comments = []
4143
self._name: str = name
4244
self.comments: Comments = comments
43-
self._tokens: Optional[List[CommonToken]] = tokens
45+
self._first_token: Optional[CommonToken] = first_token
46+
self._last_token: Optional[CommonToken] = last_token
4447

4548
# We want to have nodes be serializable with pickle.
4649
# To allow that we must not have mutable fields such as streams.
4750
# Tokens have streams, create a stream-less copy of tokens.
48-
if self._tokens:
49-
self._tokens = [t.clone() for t in self._tokens]
50-
for t in self._tokens:
51-
t.source = CommonToken.EMPTY_SOURCE
51+
if self._first_token is not None:
52+
self._first_token = self._first_token.clone()
53+
self._first_token.source = CommonToken.EMPTY_SOURCE
54+
55+
if self._last_token is not None:
56+
self._last_token = self._last_token.clone()
57+
self._last_token.source = CommonToken.EMPTY_SOURCE
5258

5359
@property
5460
def display_name(self) -> str:
@@ -57,40 +63,39 @@ def display_name(self) -> str:
5763
def __eq__(self, other) -> bool:
5864
if isinstance(self, other.__class__):
5965
return _equal_dicts(
60-
self.__dict__, other.__dict__, ["_tokens"]
66+
self.__dict__, other.__dict__, ["_first_token", "_last_token"]
6167
)
6268
return False
6369

64-
@property
65-
def tokens(self) -> Optional[List[CommonToken]]:
66-
"""List of Antlr4 tokens composing the node.
67-
68-
Note: Tokens are disconnected from underline source streams.
69-
"""
70-
return self._tokens
71-
72-
@tokens.setter
73-
def tokens(self, tokens: Optional[List[CommonToken]]):
74-
if tokens:
75-
self._tokens = [t.clone() for t in tokens]
76-
for t in self._tokens:
77-
t.source = CommonToken.EMPTY_SOURCE
78-
7970
@property
8071
def first_token(self) -> Optional[CommonToken]:
81-
"""First token of a node.
72+
"""
73+
First token of a node.
8274
8375
Note: Token is disconnected from underline source streams.
8476
"""
85-
return self._tokens[0] if self._tokens else None
77+
return self._first_token
78+
79+
@first_token.setter
80+
def first_token(self, val: Optional[CommonToken]):
81+
if val is not None:
82+
self._first_token = val.clone()
83+
self._first_token.source = CommonToken.EMPTY_SOURCE
8684

8785
@property
8886
def last_token(self) -> Optional[CommonToken]:
89-
"""Last token of a node.
87+
"""
88+
Last token of a node.
9089
9190
Note: Token is disconnected from underline source streams.
9291
"""
93-
return self._tokens[-1] if self._tokens else None
92+
return self._last_token
93+
94+
@last_token.setter
95+
def last_token(self, val: Optional[CommonToken]):
96+
if val is not None:
97+
self._last_token = val.clone()
98+
self._last_token.source = CommonToken.EMPTY_SOURCE
9499

95100
@property
96101
def start_char(self) -> Optional[int]:
@@ -144,10 +149,10 @@ class Expression(Node):
144149
"""
145150

146151
def __init__(
147-
self,
148-
name: str,
149-
wrapped=False,
150-
**kwargs,
152+
self,
153+
name: str,
154+
wrapped=False,
155+
**kwargs,
151156
):
152157
super(Expression, self).__init__(name, **kwargs)
153158
self.wrapped = wrapped
@@ -234,11 +239,11 @@ class Index(Lhs):
234239
"""
235240

236241
def __init__(
237-
self,
238-
idx: Expression,
239-
value: Expression,
240-
notation: IndexNotation = IndexNotation.DOT,
241-
**kwargs
242+
self,
243+
idx: Expression,
244+
value: Expression,
245+
notation: IndexNotation = IndexNotation.DOT,
246+
**kwargs
242247
):
243248
super(Index, self).__init__("Index", **kwargs)
244249
self.idx: Expression = idx
@@ -345,7 +350,7 @@ class If(Statement):
345350
"""
346351

347352
def __init__(
348-
self, test: Expression, body: Block, orelse: List[Statement] or ElseIf, **kwargs
353+
self, test: Expression, body: Block, orelse: List[Statement] or ElseIf, **kwargs
349354
):
350355
super().__init__("If", **kwargs)
351356
self.test: Expression = test
@@ -422,13 +427,13 @@ class Fornum(Statement):
422427
"""
423428

424429
def __init__(
425-
self,
426-
target: Name,
427-
start: Expression,
428-
stop: Expression,
429-
step: Expression,
430-
body: Block,
431-
**kwargs
430+
self,
431+
target: Name,
432+
start: Expression,
433+
stop: Expression,
434+
step: Expression,
435+
body: Block,
436+
**kwargs
432437
):
433438
super(Fornum, self).__init__("Fornum", **kwargs)
434439
self.target: Name = target
@@ -448,7 +453,7 @@ class Forin(Statement):
448453
"""
449454

450455
def __init__(
451-
self, body: Block, iter: List[Expression], targets: List[Name], **kwargs
456+
self, body: Block, iter: List[Expression], targets: List[Name], **kwargs
452457
):
453458
super(Forin, self).__init__("Forin", **kwargs)
454459
self.body: Block = body
@@ -547,12 +552,12 @@ class Method(Statement):
547552
"""
548553

549554
def __init__(
550-
self,
551-
source: Expression,
552-
name: Expression,
553-
args: List[Expression],
554-
body: Block,
555-
**kwargs
555+
self,
556+
source: Expression,
557+
name: Expression,
558+
args: List[Expression],
559+
body: Block,
560+
**kwargs
556561
):
557562
super(Method, self).__init__("Method", **kwargs)
558563
self.source: Expression = source
@@ -628,10 +633,10 @@ class String(Expression):
628633
"""
629634

630635
def __init__(
631-
self,
632-
s: str,
633-
delimiter: StringDelimiter = StringDelimiter.SINGLE_QUOTE,
634-
**kwargs
636+
self,
637+
s: str,
638+
delimiter: StringDelimiter = StringDelimiter.SINGLE_QUOTE,
639+
**kwargs
635640
):
636641
super(String, self).__init__("String", **kwargs)
637642
self.s: str = s
@@ -647,11 +652,11 @@ class Field(Expression):
647652
"""
648653

649654
def __init__(
650-
self,
651-
key: Expression,
652-
value: Expression,
653-
between_brackets: bool = False,
654-
**kwargs
655+
self,
656+
key: Expression,
657+
value: Expression,
658+
between_brackets: bool = False,
659+
**kwargs
655660
):
656661
super().__init__("Field", **kwargs)
657662
self.key: Expression = key

0 commit comments

Comments
 (0)