首页 > 解决方案 > PEG语法将计算机变成热板并且永远不会完成

问题描述

我正在尝试编写语法,以便解析特定类型的输入文件。我已经从最基本的语法开始,但是guile在尝试将模式与该语法匹配时,我的电脑几乎崩溃了。

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

输入.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包含变量的文件组成。(下一步是向这个语法添加嵌套块。)

这个语法有什么特别的错误吗?

标签: schemecontext-free-grammarpegguile

解决方案


我找到了它不起作用的原因。显然,用于 guile 的 PEG 库不采用名称中带有下划线的规则。在更改了所有规则之后block_headerbheader它就起作用了。


推荐阅读