问题标签 [grako]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
68 浏览

parsing - 改进 Grako 生成的解析器输出的错误

我试图找出改善向 Grako 生成的解析器用户显示的错误的最佳方法。Grako 生成的解析器在遇到输入文件中的某些解析问题时显示的默认解析错误似乎没有帮助。当真正的错误在不同的地方时,这些错误通常似乎暗示问题出在输入文件的一部分中。

我一直在研究 Grako Semantics 类以进行一些检查,如果检查失败,这些检查会显示更好的错误消息,但似乎可能有大量的边缘情况必须指定才能捕获所有规则解析失败的可能方式。

有没有人可以查看任何建议或示例?

0 投票
1 回答
213 浏览

python - “FailedParse: [...] Expecting end of text” 试图在 grako 中解析带括号的表达式

在中,我对3.14.0search_query.ebnf有以下语法定义:grako

我生成解析器

结果正如我对这些输入的预期一样工作:

但如果我在运算符右侧有一个带括号的表达式,解析器会给我一条错误消息:

难道我做错了什么?

0 投票
1 回答
162 浏览

python - 如何在 EBNF 中描述作用域?

我正在尝试使用 Grako 和 Python 为 Cisco IOS 和 ASA 配置编写解析器。我试图弄清楚如何在 EBNF 中表示“范围”关键字 - 例如,“描述”关键字必须出现在interface范围内,但是有多个选项interface,它们都是可选的(并且顺序可以在设备之间更改, 我相信):

我找到的最接近示例的是一个名为 Farly 的 Perl 应用程序,该应用程序使用 perl Parse::Recdescent 模块,该模块似乎类似于 Grako。

从那里我有这种类型的递归定义:

但它会产生一个奇怪的嵌套 AST,并且它不会“重置”以检测第二个接口或随后配置中的任何其他内容。

EBNF 中通常如何定义这些范围?(这种类型的东西也有有用的教程吗?我的 google-fu 并没有为 Grako 或解析器提供任何东西)

0 投票
1 回答
30 浏览

grako - 在递归规则中忽略 {} 匹配的空元素

我想描述一个可嵌套的条件。这是我正在使用的:

我可以使用以下行生成 AST:

这里是 AST :

但是“bar”之后有一个空列表,因为我猜最后一次匹配条件规则时,“condop condition”值得一个空字符串。根据文档https://pypi.python.org/pypi/grako/3.16.0,{} 生成一个空列表。

有没有办法防止这种情况发生?

0 投票
1 回答
67 浏览

python - 解析一个或多个带有有用错误的表达式

我正在使用 grako(python 的 PEG 解析器生成器库)来解析一种简单的声明性语言,其中文档可以包含一个或多个协议。

最初,我将文档的根规则写为:

document = {protocol}+ ;

这会适当地返回协议列表,但仅在第一个协议中出现语法错误时才会给出有用的错误。否则,它会默默地丢弃无效协议及其之后的所有内容。

我还尝试了一些变化:

但是,如果只有一个协议,这不会产生一个列表,也不会给出有用的错误消息,只有no available options: (...) document当任何协议包含错误时才说。

如何编写同时执行以下两项的规则?:

  1. 总是返回一个列表,即使只有一个协议
  2. 显示有关不成功匹配的有用错误消息,而不是仅仅说它是无效文档或静默删除损坏的协议
0 投票
1 回答
40 浏览

grako - 在 Grako 中使用 ModelBuilderSemantics 避免嵌套对象

如果您看一下下面的语法,您会看到一个主要规则表达式,它被解析为更具体的表达式类型。

下面的 test_input 的解析按预期工作,但我更愿意用“@”而不是“andex”来标记表达式规则中的 and_expr 元素。我希望解析后的输出只会产生一个 CompareExpression 对象,该对象位于 Expression 对象的 not_ex 元素内。

似乎在 and_expr 元素上使用“@”标签时,Expression 对象中没有显示任何属性!这是一个错误还是故意的?在使用 ModelBuilderSemantics 时,我必须用名称标记所有元素并且不使用“@”标签吗?

我一直面临的另一个问题是,如果后面的规则(例如 comp_expr)没有关联的类名,则其元素在打印时会出现在字典中,但点符号访问器会因 AttributeError 而失败,即“AttributeError : 'dict' 对象没有属性 'comp'"。即使规则没有与之关联的类名,是否有任何方法可以使用点符号访问器?

0 投票
1 回答
97 浏览

regex - 涉及正则表达式时 grako 中的空白处理

我正在尝试编写一个 grako 风格的 ebnf 语法。我注意到,在尝试解析正则表达式时,生成的解析器似乎没有超过空格或注释。

该文档在该主题上说了以下内容

与其他表达式不同,这个表达式不会超过空格或注释。为此,请将正则表达式作为其自身规则中的唯一术语。

然后我创建了一个只有一个正则表达式规则的简单语法。正则表达式也是该规则中的唯一术语。

生成的解析器在输入“abc\ndef”和“abc\ndef”上失败。第一个在最开始,第二个在第一个换行符、空格或注释。

它只发生在正则表达式中,其他规则工作正常,例如如果名称定义为

然后一切正常,上述输入成功解析。

如何更改行为以使语法超越空格和注释?

附加信息:

上述输入的痕迹:

我使用以下命令生成了解析器:

我还尝试使用 -w 选项指定空格(/\s+/ 和 /[ \t\n\r]+/ 但这并没有改变行为)

并使用以下命令启动解析器:

0 投票
1 回答
47 浏览

python - 使用 grako 生成上下文相关代码

我的情况是,我使用 grako 的模型构建器语义构建了一个抽象语法树 (AST)。现在我需要从那个 AST 生成 javascript 代码。我已经定义了几个模板,但我意识到并不是所有的情况都可以用简单的模板来处理。我坚持的具体规则是:

此规则匹配简单的函数调用和构造函数调用,因为无法从词法上确定哪个是哪个,这取决于是否在该范围内定义了具有该名称的类。

所以例如“a = Func();”

在 javascript 中,这两种情况需要不同的语法(“a = new Func();”或“a = Func();”)

所以我需要一个符号表来跟踪哪个是哪个。有没有办法用 grako 实现这一目标?

附加信息:

我如何做到这一点的想法:创建一个walker类,它建立一个符号表,当它处理一个FunctionCall对象时,检查它是否真的是一个构造函数调用,在这种情况下,用一个ConstructorCall节点替换FunctionCall节点。然后只需为两者提供两个模板。

我不喜欢这种方法的地方是它感觉太分离了,并且每个模板都需要一个新类。

0 投票
1 回答
109 浏览

bnf - Grako 左递归

我正在尝试使用 grako 来描述一个简单的左递归语法,但我很难这样做。

右递归确实可以正常工作:

根据我发现的所有示例,左递归应该这样描述:

但是,它不适用于以下给出的规则:

我收到此错误:

我在这一点上的理解是规则的第一个字符匹配symbol而不是condition "AND" symbol,所以 grako 想使用它。但是我的开始规则强制所有角色都被消耗掉了。

我已经尝试使用许多解决方法,但我一直无法找到适合的解决方法。

0 投票
1 回答
204 浏览

python - 无法在 grako 语法中定义规则优先级以处理特殊标记

我正在尝试通过 Grako 生成的语法分析一些文档,该语法应该解析简单的句子以进行进一步分析,但在使用一些特殊标记时会遇到一些困难。

(Grako 风格的)EBNF 看起来像:

我在以下内容上使用了上面的语法:

这是一个句子。这是一个句子的壮举。一个缩写。我现在不壮举。等壮举。知道英语。

使用简单的 NodeWalker 的结果:

我的期望:

我不知道为什么会发生这种情况,尤其是在最后一句中,缩写词是句子的一部分,而它们不在前面的句子中。需要明确的是,我希望句子定义中的 abbr 规则具有比 word 规则更高的优先级,但我不知道如何实现这一点。我玩弄了消极和积极的前瞻,但没有成功。我知道如何使用正则表达式来达到我的预期结果,但是进一步分析需要上下文无关的语法,所以为了可读性,我想将所有内容放在一个语法中。自从我上次以这种方式使用语法已经有一段时间了,但我不记得遇到过那种问题。我通过谷歌搜索了一段时间没有成功,所以也许社区可能会分享一些见解。

提前致谢。

如果需要,我用于测试的代码:

使用的包:Python 3.5.2 Grako 3.16.5