gpt4 book ai didi

使用 nom 解析需要先行的文本

转载 作者:行者123 更新时间:2023-11-29 08:00:29 33 4
gpt4 key购买 nike

tl;dr:我正在努力寻找需要使用 nom 进行前瞻的文本解析器的文档或示例。

长版

我正在使用 nom 来解析 6502 程序集。我正在努力创建一个可以解析各种寻址模式的解析器。任何给定的操作码都将具有以下格式:

XXX AM

其中XXX是一个三字助记符,AM是操作数。操作数可以采用多种形式,称为“寻址方式”。我已经为操作数定义了一个枚举,为寻址模式定义了一个枚举,以及一​​个包含这些值的 OpCode 元组结构,这最终是解析时返回的结果。

寻址模式可以完全省略,此时寻址模式为Implied,它可以有一个字面值A,也就是累加器 寻址方式。

许多寻址模式都涉及内存位置,我正在努力解析这些寻址模式。特别地,如果一个寻址模式以$00的形式指定一个字节,它就是一个ZeroPage寻址模式,而一个操作数以的形式指定两个字节>$0000 是一种绝对 寻址模式。使事情复杂化的是,这些寻址模式的索引变体形式为 $00,X$00,Y$0000,X、等等

现有文本解析器是否有任何好的示例可以说明解析值的正确方法,这些值都以相似的方式开始($00...),但以结束方式有所不同? nom 文档不是很全面,我找到的最好的例子是 INI 解析器,它没有像我试图完成的那样复杂。我也查看了 syn 源代码,但它使用了很多自定义宏并且是一个非常复杂的野兽,很难从中学习。

最佳答案

一种方法是使用 alt!() 宏。

这个想法是有一个解析器,它按顺序尝试每个备选方案。因此,如果您已经为每种寻址模式分别拥有解析器,则可以将它们组合成一个解析器以用于其中任何一种:

// The sub-parsers all return Operand too.
named!(parse_operand<&str, Operand>,
alt!(parse_absolute_indexed |
parse_absolute |
parse_zeropage_indexed |
parse_zeropage |
parse_implied));

一些注意事项:

  • 顺序可能很重要;我将 parse_absolute 放在 parse_absolute_indexed 之后,因为前者会匹配操作数的初始部分并过早返回。
  • 一个变体是将匹配到每个子解析器的行尾(包括注释,如果适用)包括在内。然后它不能早匹配。
  • 如果您要解析到输入的末尾而没有终止模式的字节/字符(例如换行符),那么您可能需要使用 alt_complete!() 而不是 alt!()。这样做的原因是,如果您尝试匹配 ADD $00,可能匹配 ADD $0000 的解析器必须假设如果有更多输入到达,它可能仍然匹配,并且 alt!() 不会跳到下一个案例。使用 alt_complete!(),或者将内部匹配器包装在 complete!() 中,表示不完全匹配是不匹配。

如果解析器非常复杂,与由例如可敬的 yacc 生成的解析器相比,它可能意味着做额外的工作(按顺序尝试每个解析),但我认为这不是问题这种情况。

关于使用 nom 解析需要先行的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41625967/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com