11from collections import deque
22from typing import Iterable
33
4- from syntactes import Token
4+ from syntactes import Grammar , LR0Generator , SLRGenerator , Token
55from syntactes ._action import Action , ActionType
66from syntactes ._state import LR0State
77from syntactes .parser import (
1010 ParserError ,
1111 UnexpectedTokenError ,
1212)
13- from syntactes .table import LR0ParsingTable , SLRParsingTable
13+ from syntactes .table import LR0ParsingTable
1414
1515
1616class 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