PEG 语法将计算机变成热板并且永远不会完成

PEG grammar turns computer into hot-plate and never finishes

我正在尝试编写语法,以便我可以解析特定类型的输入文件。我从尽可能最基本的语法开始,但是 guile 在尝试将模式与该语法匹配时几乎让我的计算机崩溃。

我想知道我的语法是否有歧义?这是我正在尝试解析的示例输入:

input.txt

[HELLO]
  var = 123
[]

这是我当前的脚本:

(use-modules (ice-9 peg))
(use-modules (ice-9 textual-ports))

(define *input*
  (call-with-input-file
      "test.txt" get-string-all))

(define-peg-string-patterns
  "block <-- block_header param block_closer
block_header <-- LB text RB SP
block_closer <-- LB RB SP
param <-- text SP EQ param_v SP
param_v <-- NUM
text <-- [a-zA-Z]+
NUM <-- [0-9]+
EQ < '='
LB < '['
RB < ']'
SP < [ \t\n]*")

(peg:tree (match-pattern block *input*))

要点是一个文件由包含变量的blocks组成。 (下一步是向此语法添加嵌套块。)

这个语法有什么特别不对的地方吗?

我不知道为什么它会锁定你,但你缺少 SP 来正确解析该输入。

这个:

param <-- text SP EQ param_v SP

应该是:

param <-- text SP EQ SP param_v SP

我找到了它不起作用的原因。显然,用于 guile 的 PEG 库不接受名称中带有下划线的规则。在将 block_header 等所有规则更改为 bheader 后,它起作用了。