Базовый пример Grako дает IndexError

Я хотел бы начать работу с Grako (3.6.6) и в качестве первого опыта работы с парсерами я хотел сгенерировать таблицу HTML из собственного синтаксиса. Следующий базовый тест

import grako

grammar = """table = { row }+ ;
row = (cell1:cell "|" cell2:cell) "\n";
cell = /[a-z]+/ ;
"""

model = grako.genmodel("model", grammar)

ast = model.parse(
"""a | b
c | d
""", "table")
print(ast)

приводит к ошибке

  File "test.py", line 13, in <module>
    """, "table")
  File "grako\grammars.py", line 790, in grako.grammars.Grammar.parse (grako\grammars.c:27773)
  File "grako\grammars.py", line 97, in grako.grammars.GrakoContext.parse (grako\grammars.c:4391)
  File "grako\contexts.py", line 180, in grako.contexts.ParseContext.parse (grako\contexts.c:4313)
  File "grako\grammars.py", line 594, in grako.grammars.Rule.parse (grako\grammars.c:22253)
  File "grako\grammars.py", line 597, in grako.grammars.Rule._parse_rhs (grako\grammars.c:22435)
  File "grako\contexts.py", line 399, in grako.contexts.ParseContext._call (grako\contexts.c:10088)
  File "grako\contexts.py", line 433, in grako.contexts.ParseContext._invoke_rule (grako\contexts.c:11135)
  File "grako\grammars.py", line 435, in grako.grammars.PositiveClosure.parse (grako\grammars.c:17285)
  File "grako\contexts.py", line 695, in grako.contexts.ParseContext._positive_closure (grako\contexts.c:19286)
  File "grako\contexts.py", line 696, in grako.contexts.ParseContext._positive_closure (grako\contexts.c:19240)
  File "grako\grammars.py", line 435, in grako.grammars.PositiveClosure.parse.lambda10 (grako\grammars.c:17195)
  File "grako\grammars.py", line 547, in grako.grammars.RuleRef.parse (grako\grammars.c:20774)
  File "grako\grammars.py", line 594, in grako.grammars.Rule.parse (grako\grammars.c:22253)
  File "grako\grammars.py", line 597, in grako.grammars.Rule._parse_rhs (grako\grammars.c:22435)
  File "grako\contexts.py", line 399, in grako.contexts.ParseContext._call (grako\contexts.c:10088)
  File "grako\contexts.py", line 433, in grako.contexts.ParseContext._invoke_rule (grako\contexts.c:11135)
  File "grako\grammars.py", line 326, in grako.grammars.Sequence.parse (grako\grammars.c:11582)
  File "grako\grammars.py", line 268, in grako.grammars.Token.parse (grako\grammars.c:9463)
  File "grako\contexts.py", line 543, in grako.contexts.ParseContext._token (grako\contexts.c:13772)
  File "grako\buffering.py", line 301, in grako.buffering.Buffer.match (grako\buffering.c:9168)
IndexError: string index out of range

что случается partial_match = (token[0].isalpha() and token.isalnum() and self.is_name_char(self.current()) )

Несмотря на то, что я новичок в парсерах и немного не хватает документации, я бы хотел придерживаться Грако.

Можете ли вы помочь мне настроить базовый пример, который выводит HTML для таблицы?

1 ответ

Решение

Грако не видит "\n" в грамматике правильно, потому что переводы строки не допускаются в токенах, и \n оценивается в контексте внешней тройной кавычки ("""), строка Все работает хорошо, если вы используете /\n/ вместо.

Также обратите внимание, что если \n будет частью языка, то вы, вероятно, должны написать @@whitespace условие, чтобы синтаксический анализатор не пропускал символ:

@@whitespace :: /[\t ]+/

Это правильная грамматика для вашего языка:

grammar = """
@@whitespace :: /[\t ]+/
table = { row }+ ;
row = (cell1:cell "|" cell2:cell) "\\n";
cell = /[a-z]+/ ;
"""

В настоящее время я исправляю Grako, чтобы обнаружить и сообщить об ошибках, подобных той, что есть в вашей грамматике Изменения уже есть в репозитории Bitbucket. Я сделаю релиз после того, как закончу тестирование.

Другие вопросы по тегам