ANTLR4 を使用してルールから最初のセットと次のセットを抽出することは可能ですか? 私はANTLR3でこれを少しいじりましたが、満足のいく解決策が見つかりませんでしたが、どちらかのバージョンの情報を誰かが持っていれば、それはありがたいです.
ユーザー入力をユーザーのカーソル位置まで解析し、オートコンプリートの可能な選択肢のリストを提供したいと思います。現時点では、部分的に入力されたオートコンプリート トークンには興味がありません。解析途中のある時点で、可能なすべての後続トークンを表示したいと考えています。
例えば:
sentence:
subjects verb (adverb)? '.' ;
subjects:
firstSubject (otherSubjects)* ;
firstSubject:
'The' (adjective)? noun ;
otherSubjects:
'and the' (adjective)? noun;
adjective:
'small' | 'orange' ;
noun:
CAT | DOG ;
verb:
'slept' | 'ate' | 'walked' ;
adverb:
'quietly' | 'noisily' ;
CAT : 'cat';
DOG : 'dog';
上記の文法を考えると...
ユーザーがまだ何も入力していない場合、オートコンプリート リストは ['The'] になります (基本ルールのフォローは常に EOF であるため、ルール センテンスの FOLLOW ではなく FIRST を取得する必要があることに注意してください)。
入力が「The」の場合、オートコンプリート リストは ['small', 'orange', 'cat', 'dog'] になります。
入力が「猫が寝た」の場合、オートコンプリート リストは ['静かに'、'騒々しく'、'.'] になります。
したがって、ANTLR3 は、これを行う次のセットを取得する方法を提供します。
BitSet followSet = state.following[state._fsp];
これはうまくいきます。パーサーにロジックを埋め込んで、ユーザーが配置されているルールをパーサーが呼び出すと、そのルールのフォローを取得してユーザーに提供することができます。ただし、これはネストされたルールに対してはうまく機能しません (たとえば、基本ルール。フォロー セットは無視され、サブルールは従う必要があるため)。
ユーザーがルールを完了した場合は FIRST セット (これを判断するのは難しい場合があります) と、すべての有効なオプションをカバーする FOLLOW セットを提供する必要があると思います。また、ルール レベルで 2 つのトークンが連続しないように文法を構成する必要があると思います。
上記の「firstSubject」ルールをいくつかのサブルールに分割します...
から
firstSubject:
'The'(adjective)? CAT | DOG;
に
firstSubject:
the (adjective)? CAT | DOG;
the:
'the';
ルールから FIRST セットを取得する方法に関する情報はまだ見つかりません。
ANTLR4 は、生成されたパーサーのレベルで次のように動作する方法を大幅に変更したように見えるため、この時点で、ANTLR3 を続行するか、ANTLR4 にジャンプするかはよくわかりません。
どんな提案でも大歓迎です。