|
| 1 | +from abc import ABC |
1 | 2 | from collections import deque |
2 | | -from typing import Iterable |
| 3 | +from typing import Iterable, Type |
3 | 4 |
|
4 | | -from syntactes import Grammar, LR0Generator, SLRGenerator, Token |
| 5 | +from syntactes import Grammar, LR0Generator, LR1Generator, SLRGenerator, Token |
5 | 6 | from syntactes._action import Action, ActionType |
6 | 7 | from syntactes._state import LR0State |
7 | 8 | from syntactes.parser import ( |
|
10 | 11 | ParserError, |
11 | 12 | UnexpectedTokenError, |
12 | 13 | ) |
13 | | -from syntactes.parsing_table import LR0ParsingTable |
| 14 | +from syntactes.parsing_table import ParsingTable |
14 | 15 |
|
15 | 16 |
|
16 | | -class LR0Parser: |
17 | | - """ |
18 | | - Parses streams of tokens based on the configured parsing table. |
19 | | - """ |
| 17 | +class Parser(ABC): |
| 18 | + generator_cls: Type |
20 | 19 |
|
21 | | - def __init__(self, table: LR0ParsingTable) -> None: |
| 20 | + def __init__(self, table: ParsingTable) -> None: |
22 | 21 | self._table = table |
23 | 22 | self._token_stack: deque[Token] = deque() |
24 | 23 | self._state_stack: deque[LR0State] = deque() |
25 | 24 | self._token_stream: deque[Token] = deque() |
26 | 25 |
|
27 | | - @staticmethod |
28 | | - def from_grammar(grammar: Grammar) -> "LR0Parser": |
| 26 | + @classmethod |
| 27 | + def from_grammar(cls, grammar: Grammar) -> "Parser": |
29 | 28 | """ |
30 | 29 | Create a parser for the given grammar. |
31 | 30 | """ |
32 | | - generator = LR0Generator(grammar) |
| 31 | + generator = cls.generator_cls(grammar) |
33 | 32 | parsing_table = generator.generate() |
34 | | - parser = LR0Parser(parsing_table) |
| 33 | + parser = cls(parsing_table) |
35 | 34 | return parser |
36 | 35 |
|
37 | 36 | def parse(self, stream: Iterable[Token]) -> None: |
@@ -107,17 +106,13 @@ def _raise(self, error: ParserError) -> None: |
107 | 106 | raise error from None |
108 | 107 |
|
109 | 108 |
|
110 | | -class SLRParser(LR0Parser): |
111 | | - """ |
112 | | - Parses streams of tokens based on the configured parsing table. |
113 | | - """ |
| 109 | +class LR0Parser(Parser): |
| 110 | + generator_cls = LR0Generator |
114 | 111 |
|
115 | | - @staticmethod |
116 | | - def from_grammar(grammar: Grammar) -> "SLRParser": |
117 | | - """ |
118 | | - Create a parser for the given grammar. |
119 | | - """ |
120 | | - generator = SLRGenerator(grammar) |
121 | | - parsing_table = generator.generate() |
122 | | - parser = SLRParser(parsing_table) |
123 | | - return parser |
| 112 | + |
| 113 | +class SLRParser(Parser): |
| 114 | + generator_cls = SLRGenerator |
| 115 | + |
| 116 | + |
| 117 | +class LR1Parser(Parser): |
| 118 | + generator_cls = LR1Generator |
0 commit comments