Skip to content

Commit aaae532

Browse files
committed
Adds from_grammar method to parser
1 parent 47a147c commit aaae532

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

src/syntactes/parser/parser.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from collections import deque
22
from typing import Iterable
33

4-
from syntactes import Token
4+
from syntactes import Grammar, LR0Generator, SLRGenerator, Token
55
from syntactes._action import Action, ActionType
66
from syntactes._state import LR0State
77
from syntactes.parser import (
@@ -10,7 +10,7 @@
1010
ParserError,
1111
UnexpectedTokenError,
1212
)
13-
from syntactes.table import LR0ParsingTable, SLRParsingTable
13+
from syntactes.table import LR0ParsingTable
1414

1515

1616
class LR0Parser:
@@ -24,6 +24,16 @@ def __init__(self, table: LR0ParsingTable) -> None:
2424
self._state_stack: deque[LR0State] = deque()
2525
self._token_stream: deque[Token] = deque()
2626

27+
@staticmethod
28+
def from_grammar(grammar: Grammar) -> "LR0Parser":
29+
"""
30+
Create a parser for the given grammar.
31+
"""
32+
generator = LR0Generator(grammar)
33+
parsing_table = generator.generate()
34+
parser = LR0Parser(parsing_table)
35+
return parser
36+
2737
def parse(self, stream: Iterable[Token]) -> None:
2838
"""
2939
Parses the given stream of tokens. Expects the EOF token as the last one.
@@ -101,3 +111,13 @@ class SLRParser(LR0Parser):
101111
"""
102112
Parses streams of tokens based on the configured parsing table.
103113
"""
114+
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

0 commit comments

Comments
 (0)