简体   繁体   English

Grako基本示例给出IndexError

[英]Basic Grako example gives IndexError

I'd like to get started with Grako (3.6.6) and as a first experience with parsers I wanted to generate an HTML table from a custom syntax. 我想开始使用Grako(3.6.6),作为解析器的初体验,我想从自定义语法生成HTML表。 The following basic test 以下基本测试

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)

results in an error 导致错误

  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

which happens to be partial_match = (token[0].isalpha() and token.isalnum() and self.is_name_char(self.current()) ) 碰巧是partial_match = (token[0].isalpha() and token.isalnum() and self.is_name_char(self.current()) )

Despite me being new to parsers and a little lack of documentation, I'd like to stick to Grako. 尽管我是解析器的新手,并且缺少文档,但我还是要坚持使用Grako。

Can you help me set up a basic example which outputs the HTML for a table? 您能帮我建立一个输出表格HTML的基本示例吗?

Grako is not seeing the "\\n" in the grammar correctly because newlines are not allowed in tokens, and the \\n is being evaluated in the context of the outer, triple-quote ( """ ), string. Things work fine if you use /\\n/ instead. Grako不能正确看到语法中的"\\n" ,因为令牌中不允许换行,并且在外部三重引号( """ )字符串的上下文中对\\n进行了评估。您使用/\\n/代替。

Also note that if \\n will be part of the language, then you should probably write a @@whitespace clause so the parser doesn't skip over the character: 还要注意,如果\\n将成为语言的一部分,那么您可能应该编写一个@@whitespace子句,以便解析器不会跳过该字符:

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

This is the correct grammar for your language: 这是您所用语言的正确语法:

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

I'm currently patching Grako to detect and report errors like the one in your grammar. 我目前正在修补Grako,以检测并报告语法中的错误。 The changes are already in the Bitbucket repository. 更改已在Bitbucket存储库中。 I'll make a release after I finish testing. 完成测试后,我将发布一个版本。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM