Грамматика парсера Nearley для анализа открывающих и закрывающих тегов

Скажем, у меня был простой язык для синтаксического анализа, состоящий только из строк. "this is a string"

      string -> "\"" chars "\""

Однако эта строка может содержать код в фигурных скобках. Для простоты давайте просто скажем, что это может быть только другая строка. "this is a string with {"code"}"

      code -> "{" string "}"

Как мне определить новую строку в Nearley, чтобы включить codeопределение? Я продолжаю получать огромное количество результатов, так как chars может соответствовать одному или нескольким символам.

      string -> "\"" charCode "\""

charCode -> (chars | code) charCode
| (chars | code)

code -> "{" string "}"

chars -> char chars
| char
char -> [^{}]

В идеале я смогу превратить что-то вроде этого "chars {"code"} chars chars {"code"} chars" в массив ["chars ", "code", " chars chars ", "code", " chars"]

Возможно, это можно сделать только с помощью регулярного выражения и мычания, как предлагается в этом ответе? (Открывающий и закрывающий теги в этом примере менее неоднозначны, и у меня нет таких же проблем.) [Неарли]: как разобрать совпадающий открывающий и закрывающий теги

1 ответ

Я бы, конечно, использовал лексер на основе регулярных выражений. Но вы можете попытаться написать недвусмысленную грамматику, основываясь на наблюдении, что у вас никогда не может быть двух смежных chars в charCode:

      string -> "\"" charCodeStart chars? "\""
charCodeStart -> 
               | charCodeStart chars? code

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

Другие вопросы по тегам