|
1 | 1 | from syntactes import Grammar, Rule, Token |
2 | 2 | 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 |
5 | 5 | from syntactes.parsing_table import Entry, LR0ParsingTable, SLRParsingTable |
6 | 6 |
|
7 | 7 | EOF = Token.eof() |
8 | 8 | S = Token("S", False) |
9 | 9 | E = Token("E", False) |
10 | 10 | T = Token("T", False) |
| 11 | +L = Token("L", False) |
| 12 | +C = Token("C", False) |
11 | 13 | x = Token("x", True) |
12 | 14 | PLUS = Token("+", True) |
| 15 | +LPAREN = Token("(", True) |
| 16 | +RPAREN = Token(")", True) |
13 | 17 |
|
14 | 18 | tokens_1 = {EOF, S, E, T, x, PLUS} |
15 | | - |
| 19 | +tokens_2 = {EOF, S, L, C, LPAREN, RPAREN} |
16 | 20 |
|
17 | 21 | # 1. S -> E $ |
18 | 22 | # 2. E -> T + E |
|
27 | 31 |
|
28 | 32 | grammar_1 = Grammar(rule_1_1, rules_1, tokens_1) |
29 | 33 |
|
| 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 | + |
30 | 49 |
|
31 | 50 | def lr0_state_1(): |
32 | 51 | item_1 = LR0Item(grammar_1.starting_rule, 0) # S -> . E $ |
@@ -115,3 +134,119 @@ def slr_parsing_table(): |
115 | 134 | table.add_entry(Entry(lr0_state_5(), EOF, Action.reduce(rule_4_1))) |
116 | 135 | table.add_entry(Entry(lr0_state_6(), EOF, Action.reduce(rule_2_1))) |
117 | 136 | 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