Я пытаюсь реализовать класс ModelWalker с TatSu (версия 4.4.0) для моего парсера, но он не работает. Я использовал описание для своего решения, но оно вызывает исключения, которые я не понимаю и не могу разрешить самостоятельно. Не могли бы вы мне помочь?
Это тестовая грамматика (файл test.ebnf), которую вы можете использовать для воспроизведения моих ошибок:
@@grammar::TestGrammar
START =
(
PASCALCASEID SPACE
{ PASCALCASEID SPACE }* $
)
;
SPACE =
space:/[ \n\t]*/
;
PASCALCASEID =
pascalcaseid:(/[A-Z]([a-z0-9])*([A-Z][a-z0-9]+)*/)
;
Я сгенерировал парсер, используя
python -m tatsu --generate-parser test.ebnf --outfile testparser.py
и создал ходок, как показано в следующем коде Python:
from testparser import TestGrammarParser
from testparser import TestGrammarSemantics
from tatsu.model import NodeWalker
class TestGrammarWalker(NodeWalker):
def walk_Node(self, node):
print("Reached Node", node)
def walk_str(self, s):
return s
def walk_object(self, o):
raise Exception('Unexpected tyle %s walked', type(o).__name__)
def walk__PASCALCASEID(self, node):
print("found:" + str(self.walk(node.pascalcaseid)))
parser = TestGrammarParser()
model = parser.parse("FirstId SecondId ThirdId", semantics=TestGrammarSemantics(), rule_name="START")
walker = TestGrammarWalker()
walker.walk(model)
Когда я запускаю этот код, я получаю эту ошибку
Traceback (most recent call last):
File ".../test.py", line 22, in <module>
walker.walk(model)
File "...\venv\lib\site-packages\tatsu\walkers.py", line 18, in walk
return walker(node, *args, **kwargs)
File ".../test.py", line 14, in walk_object
raise Exception('Unexpected tyle %s walked', type(o).__name__)
Exception: ('Unexpected tyle %s walked', 'list')
Если я понимаю description верно, я должен использовать тип узла, писать в моей грамматике
PASCALCASEID::PascalCaseID =
pascalcaseid:(/[A-Z]([a-z0-9])*([A-Z][a-z0-9]+)*/)
;
и в моем классе Walker
def walk__PascalCaseID(self, node):
print("found:" + str(self.walk(node.pascalcaseid)))
, но, к сожалению, это вызывает еще одно исключение:
Traceback (most recent call last):
File "C:/Users/Andreas/PycharmProjects/fpl/test.py", line 20, in <module>
model = parser.parse("FirstId SecondId ThirdID", semantics=TestGrammarSemantics(), rule_name="START")
File "...\venv\lib\site-packages\tatsu\contexts.py", line 218, in parse
result = rule()
File "...\venv\lib\site-packages\tatsu\contexts.py", line 56, in wrapper
return self._call(ruleinfo)
File "...\venv\lib\site-packages\tatsu\contexts.py", line 519, in _call
result = self._recursive_call(ruleinfo)
File "...\venv\lib\site-packages\tatsu\contexts.py", line 548, in _recursive_call
return self._invoke_rule(ruleinfo, self.memokey)
File "...\venv\lib\site-packages\tatsu\contexts.py", line 595, in _invoke_rule
ruleinfo.impl(self)
File "...\testparser.py", line 86, in _START_
self._PASCALCASEID_()
File "...\venv\lib\site-packages\tatsu\contexts.py", line 56, in wrapper
return self._call(ruleinfo)
File "...\venv\lib\site-packages\tatsu\contexts.py", line 519, in _call
result = self._recursive_call(ruleinfo)
File "...\venv\lib\site-packages\tatsu\contexts.py", line 548, in _recursive_call
return self._invoke_rule(ruleinfo, self.memokey)
File "...\venv\lib\site-packages\tatsu\contexts.py", line 597, in _invoke_rule
node = self._invoke_semantic_rule(ruleinfo, node)
File "...\venv\lib\site-packages\tatsu\contexts.py", line 623, in _invoke_semantic_rule
node = semantic_rule(node, *(rule.params or ()), **(rule.kwparams or {}))
TypeError: PASCALCASEID() takes 2 positional arguments but 3 were given