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
后,它起作用了。
我正在尝试编写语法,以便我可以解析特定类型的输入文件。我从尽可能最基本的语法开始,但是 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
后,它起作用了。