[英]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.