идея грамматического комплекта восстановления, когда кеширует парсер на первом элементе в списке - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть грамматика BNF:

{
    tokens = [
        COLON = ":"
        space=' '
        word = 'regexp:[^\r\n\s\t@\$\{\}\(\)\|\#:<>]+'
        nl = 'regexp:\r|\n|(\r\n)'
    ]
}

root ::= nlsp book_keyword COLON [space] book_title sections
book_keyword ::= 'Journal Book' | 'Fiction Book'
book_title ::= (! section (word | string) space?)+

sections ::= section+

section ::= nlsp section_keyword COLON [space] section_title {recoverWhile='sectionRecover'}
section_keyword ::= 'Section' | 'Content'
section_title ::= (!section (word | space | COLON))+

sectionRecover ::= !(nlsp| section_keyword)

nlsp ::= (NL| space)*

Текст для проверки:

Fiction Book: Some Fiction
    Section: Chapter One
    Section: Chapter Two Section
    Content: Chapter Three

Если я сделаю ошибку во втором или последующем элементе, все будет в порядке, но если в первом Sectio: Chapter One все пси-дерево будет сломано.

enter image description here

1 Ответ

0 голосов
/ 20 ноября 2018

Я вижу несколько проблем: 1) у вас должен быть токен пробела.Примерно так:

WHITESPACE="regexp:[ \n\r\t\f]"

, как следствие, вам больше не нужен пробел и npsp

2) правило restoreWhile должно быть указано без кавычек

3) sectionRecoverсопоставление пробелов, что, скорее всего, неверно

...