Skip to content

Commit e68761b

Browse files
committed
Adds new test grammar and lr1 states
1 parent e824720 commit e68761b

File tree

1 file changed

+138
-3
lines changed

1 file changed

+138
-3
lines changed

src/syntactes/tests/data.py

Lines changed: 138 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
from syntactes import Grammar, Rule, Token
22
from syntactes._action import Action
3-
from syntactes._item import LR0Item
4-
from syntactes._state import LR0State
3+
from syntactes._item import LR0Item, LR1Item
4+
from syntactes._state import LR0State, LR1State
55
from syntactes.parsing_table import Entry, LR0ParsingTable, SLRParsingTable
66

77
EOF = Token.eof()
88
S = Token("S", False)
99
E = Token("E", False)
1010
T = Token("T", False)
11+
L = Token("L", False)
12+
C = Token("C", False)
1113
x = Token("x", True)
1214
PLUS = Token("+", True)
15+
LPAREN = Token("(", True)
16+
RPAREN = Token(")", True)
1317

1418
tokens_1 = {EOF, S, E, T, x, PLUS}
15-
19+
tokens_2 = {EOF, S, L, C, LPAREN, RPAREN}
1620

1721
# 1. S -> E $
1822
# 2. E -> T + E
@@ -27,6 +31,21 @@
2731

2832
grammar_1 = Grammar(rule_1_1, rules_1, tokens_1)
2933

34+
# 1. S -> L $
35+
# 2. L -> L C
36+
# 3. L -> C
37+
# 4. C -> LPAREN C RPAREN
38+
# 5. C -> LPAREN RPAREN
39+
rule_1_2 = Rule(0, S, L, EOF)
40+
rule_2_2 = Rule(1, L, L, C)
41+
rule_3_2 = Rule(2, L, C)
42+
rule_4_2 = Rule(3, C, LPAREN, C, RPAREN)
43+
rule_5_2 = Rule(4, C, LPAREN, RPAREN)
44+
45+
rules_2 = (rule_1_2, rule_2_2, rule_3_2, rule_4_2, rule_5_2)
46+
47+
grammar_2 = Grammar(rule_1_2, rules_2, tokens_2)
48+
3049

3150
def lr0_state_1():
3251
item_1 = LR0Item(grammar_1.starting_rule, 0) # S -> . E $
@@ -115,3 +134,119 @@ def slr_parsing_table():
115134
table.add_entry(Entry(lr0_state_5(), EOF, Action.reduce(rule_4_1)))
116135
table.add_entry(Entry(lr0_state_6(), EOF, Action.reduce(rule_2_1)))
117136
return table
137+
138+
139+
def lr1_state_1():
140+
item_1 = LR1Item(rule_1_2, 0, EOF) # S -> . L $, $
141+
item_2 = LR1Item(rule_2_2, 0, EOF) # L -> . L C, $
142+
item_3 = LR1Item(rule_2_2, 0, LPAREN) # L -> . L C, (
143+
item_4 = LR1Item(rule_3_2, 0, EOF) # L -> . C, $
144+
item_5 = LR1Item(rule_3_2, 0, LPAREN) # L -> . C, (
145+
item_6 = LR1Item(rule_4_2, 0, EOF) # C -> . ( C ), $
146+
item_7 = LR1Item(rule_4_2, 0, LPAREN) # C -> . ( C ), (
147+
item_8 = LR1Item(rule_5_2, 0, EOF) # C -> . (), $
148+
item_9 = LR1Item(rule_5_2, 0, LPAREN) # C -> . (), (
149+
state = LR1State.from_items(
150+
{item_1, item_2, item_3, item_4, item_5, item_6, item_7, item_8, item_9}
151+
)
152+
state.set_number(1)
153+
return state
154+
155+
156+
def lr1_state_2():
157+
item_1 = LR1Item(rule_1_2, 1, EOF) # S -> L . $, $
158+
item_2 = LR1Item(rule_2_2, 1, EOF) # L -> L . C, $
159+
item_3 = LR1Item(rule_2_2, 1, LPAREN) # L -> L . C, (
160+
item_4 = LR1Item(rule_4_2, 0, EOF) # C -> . ( C ), $
161+
item_5 = LR1Item(rule_4_2, 0, LPAREN) # C -> . ( C ), (
162+
item_6 = LR1Item(rule_5_2, 0, EOF) # C -> . ( ), $
163+
item_7 = LR1Item(rule_5_2, 0, LPAREN) # C -> . ( ), (
164+
state = LR1State.from_items(
165+
{item_1, item_2, item_3, item_4, item_5, item_6, item_7}
166+
)
167+
state.set_number(2)
168+
state.set_final()
169+
return state
170+
171+
172+
def lr1_state_3():
173+
item_1 = LR1Item(rule_3_2, 1, EOF) # L -> C ., $
174+
item_2 = LR1Item(rule_3_2, 1, LPAREN) # L -> C ., (
175+
state = LR1State.from_items({item_1, item_2})
176+
state.set_number(3)
177+
return state
178+
179+
180+
def lr1_state_4():
181+
item_1 = LR1Item(rule_4_2, 0, RPAREN) # C -> . ( C ), )
182+
item_2 = LR1Item(rule_4_2, 1, EOF) # C -> ( . C ), $
183+
item_3 = LR1Item(rule_4_2, 1, LPAREN) # C -> ( . C ), (
184+
item_4 = LR1Item(rule_5_2, 0, RPAREN) # C -> . ( ), )
185+
item_5 = LR1Item(rule_5_2, 1, EOF) # C -> ( . ), $
186+
item_6 = LR1Item(rule_5_2, 1, LPAREN) # C -> ( . ), (
187+
state = LR1State.from_items({item_1, item_2, item_3, item_4, item_5, item_6})
188+
state.set_number(4)
189+
return state
190+
191+
192+
def lr1_state_5():
193+
item_1 = LR1Item(rule_2_2, 2, EOF) # L -> L C ., $
194+
item_2 = LR1Item(rule_2_2, 2, LPAREN) # L -> L C ., (
195+
state = LR1State.from_items({item_1, item_2})
196+
state.set_number(5)
197+
return state
198+
199+
200+
def lr1_state_6():
201+
item_1 = LR1Item(rule_4_2, 2, EOF) # C -> ( C . ), $
202+
item_2 = LR1Item(rule_4_2, 2, LPAREN) # C -> ( C . ), (
203+
state = LR1State.from_items({item_1, item_2})
204+
state.set_number(6)
205+
return state
206+
207+
208+
def lr1_state_7():
209+
item_1 = LR1Item(rule_4_2, 0, RPAREN) # C -> . ( C ), )
210+
item_2 = LR1Item(rule_4_2, 1, RPAREN) # C -> ( . C ), )
211+
item_3 = LR1Item(rule_5_2, 0, RPAREN) # C -> . ( ), )
212+
item_4 = LR1Item(rule_5_2, 1, RPAREN) # C -> ( . ), )
213+
state = LR1State.from_items({item_1, item_2, item_3, item_4})
214+
state.set_number(7)
215+
return state
216+
217+
218+
def lr1_state_8():
219+
item_1 = LR1Item(rule_5_2, 2, EOF) # C -> ( ) ., $
220+
item_2 = LR1Item(rule_5_2, 2, LPAREN) # C -> ( ) ., (
221+
state = LR1State.from_items({item_1, item_2})
222+
state.set_number(8)
223+
return state
224+
225+
226+
def lr1_state_9():
227+
item_1 = LR1Item(rule_4_2, 3, EOF) # C -> ( C ) ., $
228+
item_2 = LR1Item(rule_4_2, 3, LPAREN) # C -> ( C ) ., (
229+
state = LR1State.from_items({item_1, item_2})
230+
state.set_number(9)
231+
return state
232+
233+
234+
def lr1_state_10():
235+
item_1 = LR1Item(rule_4_2, 2, RPAREN) # C -> ( C . ), )
236+
state = LR1State.from_items({item_1})
237+
state.set_number(10)
238+
return state
239+
240+
241+
def lr1_state_11():
242+
item_1 = LR1Item(rule_5_2, 2, RPAREN) # C -> ( ) ., )
243+
state = LR1State.from_items({item_1})
244+
state.set_number(11)
245+
return state
246+
247+
248+
def lr1_state_12():
249+
item_1 = LR1Item(rule_4_2, 3, RPAREN) # C -> ( C ) ., )
250+
state = LR1State.from_items({item_1})
251+
state.set_number(12)
252+
return state

0 commit comments

Comments
 (0)