Грамматика парсера 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
Вам, вероятно, придется немного поиграть с этим, чтобы понять это правильно. Я почти не использую.