1

解析する必要のあるソフトウェアからの(独自の)出力があります。悲しいことに、エスケープされていないユーザー名があり、BNF(またはEBNFまたはABNF)を使用して解析する必要のあるファイルを記述できるかどうかを知りたいと思っています。

過度に単純化された問題(これは実際には単なる例です)は、次のようになります。

(データ)::=<ユーザー名>
<ユーザー名>::=(他のタイプのデータ)

また、場合によっては、ユーザー名を左または右に表示する代わりに、行の中央に表示することもできます。

問題は、ユーザー名がエスケープされておらず、ユーザー名に十分な制限がないことです(印刷可能なASCII、最大20文字であり、改行を含めることはできません)。たとえば、「=」は完全に有効なユーザー名になります。また、「= 1 = john = 2」も同様です(ユーザーは、サインオン時に、必要なユーザー名を選択でき、これらは取得した出力でエスケープされていないように見えるため)。

私のパーサーがいくつかの非常に創造的なユーザー名を窒息させたので(もう一度、私の制御ではなく、それらは「奇妙」であり、私はそれに対処する必要があります)、これに対処する簡単な方法を見つけることができないので、私は尋ねています。また、ユーザー名が事前にわからないことにも注意してください(たとえば、ユーザーが作成したすべてのユーザー名を含むデータベースにアクセスできません)。

では、無制限でエスケープされていないユーザー名はBNFと互換性がありませんか?

PS:間違いを犯した場合は、私と一緒にクールになってください、それはstackoverflowに関する私の最初の投稿です:)

4

2 に答える 2

1

BNFは、ユーザー名自体を「気にしません」。トークンレベルで機能します。トークンを定義する usernameと、それに基づいてBNFを使用して文法を記述できます。

問題はレクサーレベルで解決する必要があります。レクサーは、エスケープされていない場合でもユーザー名を認識し、usernameトークンをパーサーに渡すのに十分なほどスマートである必要があります。

理論的には、あらゆる種類のユーザー名を文法で記述することができますが、これは言語の他のものに大きく依存します。=有効なトークンはそれ自体ですか?それがそうである場合、それを区別しているユーザー名をどのように見分けることができます=か?ここでより完全な答えを得るには、残りのルールと有効なトークンを自分の言語で説明する必要があると思います。

于 2010-01-23T12:26:34.117 に答える
1

ユーザー名ではないものを認識し、それ以外のすべてをユーザー名として宣言することで作業できる可能性があります。これは、左から右ではなく右から左に解析したり、同じように風変わりなことをしたりすることを意味します。

入力が実際にあいまいであるかどうかを確認する価値があるかもしれません。同じ出力が生成される原因となる2つの異なる状況を見つけることができますか?もしそうなら、あなたは戻って、それらのどれを支持するか、またはどのような種類のエラーを生成するかなどの要件を取得する必要があります。そうでない場合、その理由は、パーサーやレクサー、または何をする必要があるかを理解するのに役立つ可能性があります。

于 2010-01-23T13:39:36.807 に答える