Skip to content

Commit 392fb27

Browse files
committed
Adds initial state property to parsing table
1 parent d6f266c commit 392fb27

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

src/syntactes/table.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class LR0ParsingTable:
4646
def __init__(self, grammar: Grammar) -> None:
4747
self.rows: dict[LR0State, Row] = dict()
4848
self._grammar = grammar
49+
self._initial_state = None
4950

5051
def get_actions(self, state: LR0State, token: Token) -> Optional[list[Action]]:
5152
"""
@@ -65,9 +66,12 @@ def add_entry(self, entry: Entry) -> None:
6566
"""
6667
Adds an entry to the parsing table.
6768
"""
68-
self.rows.setdefault(entry.from_state, {}).setdefault(
69-
entry.token, list()
70-
).append(entry.action)
69+
if entry.from_state.number == 1:
70+
self._initial_state = entry.from_state
71+
72+
row = self.rows.setdefault(entry.from_state, {})
73+
actions = row.setdefault(entry.token, list())
74+
actions.append(entry.action)
7175

7276
@staticmethod
7377
def from_entries(
@@ -86,6 +90,10 @@ def pretty_str(self) -> str:
8690
"""
8791
return self._rules_pretty_str() + "\n\n" + self._table_pretty_str()
8892

93+
@property
94+
def initial_state(self) -> LR0State:
95+
return self._initial_state
96+
8997
def _rules_pretty_str(self) -> str:
9098
rules = [str(i) + ". " + str(r) for i, r in enumerate(self._grammar.rules)]
9199
rules_str = "\n".join(rules)

src/syntactes/tests/test_generator.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,13 @@ def test_state_6_token_plus(self):
262262
def test_state_6_token_x(self):
263263
self.assert_state_actions(reduce(rule_2))
264264

265+
class TestLR0GeneratorGenerateInitialState(TestLR0Generator):
266+
def subject(self):
267+
return self.generator().generate().initial_state
268+
269+
def test_initial_state(self):
270+
self.assertResult(state_1())
271+
265272

266273
class TestSLRGenerator(TestCase):
267274
def setUp(self):
@@ -370,3 +377,11 @@ def test_state_5_token_eof(self):
370377
@args(state_6(), EOF)
371378
def test_state_6_token_eof(self):
372379
self.assert_state_actions(reduce(rule_2))
380+
381+
382+
class TestSLRGeneratorGenerateInitialState(TestSLRGenerator):
383+
def subject(self):
384+
return self.generator().generate().initial_state
385+
386+
def test_initial_state(self):
387+
self.assertResult(state_1())

0 commit comments

Comments
 (0)