PEG грамматика превращает компьютер в плиту и никогда не заканчивается - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь написать грамматику, чтобы я мог разобрать указанный c тип входного файла. Я начал с самой базовой грамматики c, но 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, который содержит переменные. (Следующий шаг - добавление вложенных блоков в эту грамматику.)

Что-то не так с этой грамматикой?

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Я нашел причину, почему она не работала. Очевидно, что библиотека PEG для guile не принимает правила с подчеркиванием в имени. После изменения всех правил вроде block_header на bheader все заработало.

0 голосов
/ 07 апреля 2020

Я не знаю, почему он зависает от вас, но вам не хватает SP для этого ввода для правильного анализа.

Это:

param <-- text SP EQ param_v SP

должно быть :

param <-- text SP EQ SP param_v SP
...