Skip to content

Commit 05afbf4

Browse files
committed
Parser: support more grammatical rules. Added empty parsing rules for the rest of grammar.
1 parent d5c4b88 commit 05afbf4

File tree

3 files changed

+301
-39
lines changed

3 files changed

+301
-39
lines changed

docs/CFG.md

+1-3
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ A preliminary note on the meaning of postfixes in left-hand-side symbols:
5252
<exprns-ne> ::= <expr>
5353
| <expr>, <exprns-ne>
5454
55-
<expr> ::= <assignment>
55+
<expr> ::= ID <- <expr>
5656
| <expr><at-type>.ID( <exprns> )
5757
| <if-then-else>
5858
| <while>
@@ -77,8 +77,6 @@ A preliminary note on the meaning of postfixes in left-hand-side symbols:
7777
| true
7878
| false
7979
80-
<assignment> ::= ID <- <expr>
81-
8280
<at-type> ::= @TYPE
8381
| ""
8482

pycoolc/ast.py

+62-7
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
# -----------------------------------------------------------------------------
99

1010

11-
class Base:
11+
class BaseNode:
1212
def __init__(self):
1313
pass
1414

@@ -22,22 +22,22 @@ def __str__(self):
2222
return str(self.to_tuple())
2323

2424

25-
class Program(Base):
25+
class ProgramNode(BaseNode):
2626
NODE_NAME = "PROGRAM"
2727

2828
def __init__(self, classes):
29-
super(Program, self).__init__()
29+
super(ProgramNode, self).__init__()
3030
self.classes = classes
3131

3232
def to_tuple(self):
3333
return tuple([self.NODE_NAME, self.classes])
3434

3535

36-
class Class(Base):
36+
class ClassNode(BaseNode):
3737
NODE_NAME = "CLASS"
3838

3939
def __init__(self, name, inherits, features):
40-
super(Class, self).__init__()
40+
super(ClassNode, self).__init__()
4141
self.name = name
4242
self.inherits = inherits
4343
self.features = features
@@ -46,13 +46,68 @@ def to_tuple(self):
4646
return tuple([self.NODE_NAME, self.name, self.inherits, self.features])
4747

4848

49-
class Inheritance(Base):
49+
class InheritanceNode(BaseNode):
5050
NODE_NAME = "INHERITS"
5151

5252
def __init__(self, inheritance_type=None):
53-
super(Inheritance, self).__init__()
53+
super(InheritanceNode, self).__init__()
5454
self.inheritance_type = inheritance_type
5555

5656
def to_tuple(self):
5757
return tuple([self.NODE_NAME, self.inheritance_type])
5858

59+
def is_empty(self):
60+
return self.inheritance_type is None
61+
62+
63+
class FeaturesNode(BaseNode):
64+
NODE_NAME = "FEATURES"
65+
66+
def __init__(self, features):
67+
super(FeaturesNode, self).__init__()
68+
if features is None:
69+
self.features = tuple()
70+
else:
71+
self.features = features
72+
73+
def to_tuple(self):
74+
return tuple([self.NODE_NAME, self.features])
75+
76+
def is_empty(self):
77+
return len(self.features) == 0
78+
79+
80+
class AttributeNode(BaseNode):
81+
NODE_NAME = "FORMAL"
82+
83+
def __init__(self, identifier, attr_type, formals, expression):
84+
super(AttributeNode, self).__init__()
85+
self.identifier = identifier
86+
self.type = attr_type
87+
self.expression = expression
88+
self.formals = formals
89+
90+
def to_tuple(self):
91+
return tuple([self.NODE_NAME, self.identifier, self.type, self.expression, self.formals])
92+
93+
94+
class FormalNode(BaseNode):
95+
NODE_NAME = "FORMAL"
96+
97+
def __init__(self, identifier, formal_type, assignment):
98+
super(FormalNode, self).__init__()
99+
self.identifier = identifier
100+
self.type = formal_type
101+
self.assignment = assignment
102+
103+
def to_tuple(self):
104+
return tuple([self.NODE_NAME, self.identifier, self.type, self.assignment])
105+
106+
107+
class Expr(BaseNode):
108+
NODE_NAME = "EXPRESSION"
109+
110+
def __init__(self, expression):
111+
super(Expr, self).__init__()
112+
self.expression = expression
113+

0 commit comments

Comments
 (0)