1

我有一个需要解析的软件的(专有)输出。可悲的是,有未转义的用户名,我正在抓挠我的头发,试图知道我是否可以描述我需要使用 BNF(或 EBNF 或 ABNF)解析的文件。

这个问题,过于简单化了(它实际上只是一个例子),可能看起来像这样:

(数据) ::= <用户名>
<用户名> ::= (其他类型的数据)

并且在某些情况下,用户名也可以出现在一行的中间,而不是出现在左侧或右侧。

问题是用户名未转义,并且对用户名没有足够的限制(它们是可打印的 ASCII,最多 20 个字符,并且不能包含换行符)。因此,例如,“=”将是一个完全有效的用户名。“= 1 = john = 2”也是如此(因为用户在登录时可以选择他们想要的任何用户名,并且这些在我得到的输出中显示为未转义)。

我问是因为我的解析器阻塞了一些非常有创意的用户名(再一次,不在我的控制范围内,它们很“奇怪”,我需要处理它),我找不到一个简单的方法来处理这个问题。另请注意,我事先不知道用户名(例如,我无权访问包含用户创建的所有用户名的数据库)。

那么不受限制和未转义的用户名是否与 BNF 不兼容?

PS:如果我犯了错误,请对我保持冷静,这是我在 stackoverflow 上的第一篇文章 :)

4

2 回答 2

1

BNF 本身并不“关心”用户名。它适用于令牌级别。如果你定义了一个 usernametoken,你可以基于它使用BNF构建描述语法。

您的问题应该在词法分析器级别解决。词法分析器应该足够智能以识别用户名,即使它们没有被转义,并将username标记传递给解析器。

理论上,您可以用语法描述各种用户名,但这在很大程度上取决于您的语言中的其他内容。=一个有效的令牌本身就是一个有效的令牌吗?如果是,您如何区分其中包含的用户名=?我认为您必须用您的语言描述其余规则和有效标记才能在此处获得更完整的答案。

于 2010-01-23T12:26:34.117 回答
1

可以通过识别不是用户名的东西然后将其他所有东西声明为用户名来工作,即使这意味着从右到左而不是从左到右解析或做同样古怪的事情。

可能值得看看你的输入是否真的模棱两可:你能找到两种不同的情况导致产生相同的输出吗?如果是这样,您需要返回并获取对它们中的哪一个有利的要求,或者产生什么样的错误,或者其他什么。如果没有,为什么不这样做的原因可能会帮助您弄清楚您的解析器或词法分析器或任何需要做的事情。

于 2010-01-23T13:39:36.807 回答