私は現在、独身プロジェクトの一環としてポーカーハンドヒストリーパーサーに取り組んでいます。私は過去数日間いくつかの調査を行っており、いくつかの優れたパーサージェネレーターに出くわしました(プロジェクト自体はJavaでコーディングされるため、JavaCCを選択しました)。
ハンドヒストリーの文法は非常に基本的でわかりやすいものですが、プレーヤーのニックネームに使用できる文字のセットが原因で、あいまいさの問題があります。
次の形式の行があるとします。
Seat 5: myNickname (1500 in chips)
トークンmyNickname
には、空白だけでなく任意の文字を含めることができます。これは、との両方(1500 in chip
がSeat 5:
有効なニックネームであることを意味します。これは、最終的にあいまいさの問題につながります。長さ(4〜12文字)を除いて、プレーヤーのニックネームに制限はありません。
プレーヤーのニックネーム(たとえば、この特定の場合の座席位置とチップの量)とともにいくつかのデータを解析して保存する必要があるので、私の質問は、ここでの私のオプションは何ですか?
私はJavaCCを使用してそれをやりたいと思っています。
SeatRecord seat() :
{ Token seatPos, nickname, chipStack; }
{
"Seat" seatPos=<INTEGER> ":" nickname=<NICKNAME> "(" chipStack=<INTEGER>
"in chips)"
{
return new SeatRecord(seatPos.image, nickname.image, chipStack.image);
}
}
現在は機能しません(前述の問題のため)
また、GLRパーサー(あいまいな文法を処理しているようです)も検索しましたが、Bisonを除いて、ほとんどが放棄されているか、文書化が不十分であるようですが、Java用のGLRパーサーはサポートされておらず、複雑すぎて操作できない可能性がありますとにかく(あいまいさの問題は別として、私が述べたように、文法自体はかなり基本的です)
または、文字列を自分でトークン化することに固執し、indexOf(), lastIndexOf()
etcを使用して必要なデータを解析する必要がありますか?それがあまりにも醜い私見であり、いくつかのケースを見逃すかもしれないので、それが残っている唯一のオプションである場合にのみそれを選びます(それは間違った構文解析につながるでしょう)