2016-12-03 3 views
1

私はbychanライブラリを使用していますが、この質問は主にそれを取り巻いています。次のトークンがENDかどうかを確認する方法はありますか?

私はちょうどminilangの例をチェックアウトし、コードを読んでいます。 StatementNodeを見たとき、私は従来の目的のために終了セミコロンを追加する方法を見つけるのに苦労していました。この例では、;を使用して文を区切りますが、最後の文の末尾が;で終わるスクリプトを終了する方法はありません。その理由は、パーサーが最後を解析できないためです。

'Premature end reached' @ position ..., current lexeme is END ... 

次のトークンがENDであるかどうかをチェックする方法はありますか、私が間違っていると思っていることを先に調べることは正しいことではなく、他の方法があるのですか?

私は前にparser.nextIs(EndToken.get())を試してみましたが、IDEは、単に私が解決策を見つけ出すために、Javaでその進歩ではないかもしれないno instance(s) of type variable(s) N exist so that EndToken<N> conforms to TokenKey

を言います。 :(

から:https://github.com/atorstling/bychan/issues/37

答えて

0

これは省略したコアパーサPrattParserは、次のトークンを取得するためのpeek()機能を持っており、あなたが任意のトークン・タイプと比較することができますあなたはそのpeek().getToken().equals(EndToken.get())として

を使用します。。。

ダイナミックパッケージ用のパーサー・インタフェース、UserParserCallback、同じもののために別のインタフェースがあります。。。nextIs(TokenKey)をアイデアはjavasがequalsを組み込みよりも多くのタイプセーフ平等のチェックを作成することでした平等型がTokenKeyと呼ばれていた

EndTokenのような静的トークンにTokenKeyがないという問題が発生しました。問題37の修正によりこれが解決されました。

これでparser.nextIs(EndToken.get().getKey())に電話することができます。たとえば、ReadmeExamples::statementsを参照してください。

関連する問題