39 lines
1017 B
Python
39 lines
1017 B
Python
from __future__ import annotations
|
|
|
|
import inspect
|
|
|
|
from .contexts import ( # noqa: F401
|
|
ParseContext,
|
|
isname,
|
|
leftrec,
|
|
nomemo,
|
|
tatsumasu,
|
|
)
|
|
from .exceptions import FailedRef
|
|
|
|
|
|
class Parser(ParseContext):
|
|
def _find_rule(self, name):
|
|
rule = getattr(self, '_' + name + '_', None)
|
|
if isinstance(rule, type(self._find_rule)):
|
|
return rule
|
|
rule = getattr(self, name, None)
|
|
if isinstance(rule, type(self._find_rule)):
|
|
return rule
|
|
self._error(name, exclass=FailedRef)
|
|
return None
|
|
|
|
@classmethod
|
|
def rule_list(cls):
|
|
methods = inspect.getmembers(cls, predicate=inspect.isroutine)
|
|
result = []
|
|
for m in methods:
|
|
name = m[0]
|
|
if len(name) < 3:
|
|
continue
|
|
if name.startswith('__') or name.endswith('__'):
|
|
continue
|
|
if name.startswith('_') and name.endswith('_'):
|
|
result.append(name[1:-1])
|
|
return result
|