Являются ли неэкранированные имена пользователей несовместимыми с BNF? - PullRequest
1 голос
/ 23 января 2010

Я получил (проприетарный) вывод от программного обеспечения, которое мне нужно проанализировать. К сожалению, есть неэкранированные имена пользователей, и я ломаю голову, пытаясь понять, могу ли я описать файлы, которые мне нужно проанализировать, используя BNF (или EBNF или ABNF), или нет.

Слишком упрощенная проблема (на самом деле это просто пример) может выглядеть так:

(данные) :: =
:: = (другой тип данных)

И в некоторых случаях вместо того, чтобы появляться слева или справа, имя пользователя также может появляться в середине строки.

Проблема заключается в том, что имя пользователя не экранировано и не хватает ограничений на имена пользователей (они могут быть напечатаны в формате ASCII, максимум 20 символов и не могут содержать разрыв строки). Так, например, "=" будет совершенно корректным именем пользователя. И так будет "= 1 = john = 2" (потому что пользователь, при входе в систему, где разрешено выбирать любое имя пользователя, которое он хочет, и они отображаются без выхода в вывод, который я получил).

Я спрашиваю, потому что мой парсер нажал на некоторые очень креативные имена пользователей (опять же, не под моим контролем, они "странные", и мне нужно с этим справиться), и я не могу найти простой способ справиться с этим , Также обратите внимание, что я заранее не знаю имен пользователей (например, у меня нет доступа к базе данных, которая будет содержать все имена пользователей, созданные пользователями).

Значит, неограниченные и незащищенные имена пользователей несовместимы с BNF?

P.S: будь спокоен со мной, если я допустил ошибки, это мой первый пост на stackoverflow:)

Ответы [ 2 ]

1 голос
/ 23 января 2010

Можно работать, распознавая вещи, которые не являются именами пользователей, а затем объявляя все остальное именем пользователя, даже если это означает анализ справа налево вместо слева направо или выполнение чего-то одинаково эксцентричного.

Может быть, стоит посмотреть, является ли ваш вклад на самом деле неоднозначным: можете ли вы найти две разные ситуации, которые приводят к генерированию идентичного результата? Если это так, вам нужно вернуться и получить требования, какие из них следует отдать предпочтение, какую ошибку допустить или что-то еще. Если нет, то причина, по которой это не так, может помочь вам понять, что нужно делать вашему синтаксическому анализатору или лексеру или что-то еще.

1 голос
/ 23 января 2010

BNF не заботится об именах пользователей как таковых. Работает на уровне токенов. Если вы определите токен username, вы можете построить описательную грамматику, используя BNF на ее основе.

Ваша проблема должна быть решена на уровне лексера. Лексер должен быть достаточно умен, чтобы распознавать имена пользователей, даже если они не экранированы, и передавать токены username парсеру.

Теоретически вы можете описать все виды имен пользователей с помощью грамматики, но это сильно зависит от других вещей на вашем языке. Является ли = действительным токеном сам по себе? Как вы можете отличить имя пользователя от =, если оно есть? Я думаю, вам придется описать остальные правила и действительные токены на вашем языке, чтобы получить более полный ответ здесь.

...