Почему Тацу Уокер поднимает исключения - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь реализовать класс 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
...