tl; dr:私はnomを使用して先読みを必要とする文書パーサーの例やドキュメントを見つけるのに苦労しています。nomを使用して先読みが必要なテキストを解析する
ロングバージョン
私は6502アセンブリを解析するためにNOMを使用しています。私は、さまざまなアドレッシングモードを解析できるパーサを作成することに苦労しています。 XXX
は3文字のニーモニックであるとAM
がオペランドである
XXX AM
:任意の所与のオペコードは、次の形式を持っています。オペランドは多くの形式をとることができ、「アドレッシングモード」と呼ばれます。私は、オペランドの列挙型、アドレッシングモードの列挙型、およびこれらの値を含むタプル構造体OpCode
を定義しました。これは最終的に解析時に返される結果です。
アドレッシングモードは完全に省略することができます。この場合、アドレッシングモードはImplied
です。リテラル値はA
で、これはAccumulator
アドレッシングモードです。
アドレッシングモードの多くはメモリ位置を参照しています。これらのアドレッシングモードは解析するのに苦労しています。特に、アドレッシングモードが$00
の形式で単一バイトを指定する場合、それはZeroPage
アドレッシングモードであり、$0000
の形式の2バイトを指定するオペランドはAbsolute
アドレッシングモードです。問題を複雑にし、$00,X
の形でこれらのアドレッシングモードのインデックス化変異体、$00,Y
、$0000,X
など
があり、そのすべての開始値を解析するために正しい方法を示します既存のテキストパーサのいずれかの良い例があります同様に()、どのようにそれらが終わるかによって区別されますか? nomのドキュメントはあまり包括的ではありません。私が見つけた最良の例はINIパーサです。これは達成しようとしているほど複雑なことをしていません。私もsynソースコードを見てきましたが、それはカスタムマクロをたくさん使用しており、かなり複雑な獣ですから、学ぶのは難しいです。
[私が書いた6502エミュレータ、アセンブラ、逆アセンブラの箱](https://github.com/simon-whitehead/rs6502)はこれを手で動かします。おそらく、Rustの解析の最良の例ではありませんが、それは確かにそれを行うことができます(注:私はまだこれをクリーンアップ段階にしていますが、今は休日が進行しています。アセンブラフォルダはすべてどこにあるのですか?非常に明示的でかなりネストされていますが、何かに役立つかもしれませんか?注 - 私は先を見ていません。私はちょうどそれをトークン化し、私が行くようにそれを把握する。だから私はあなたが何をしているのか分からないのですか? –
私はnomaを使ってやってみようとしていること、あるいは少なくとも私が現在それに近づいていることにlookaheadが必要であると思います。好奇心のために、あなたのアセンブラは自己完結型ですか?私は本当に簡単なものを探しています。私が書いているNESエミュレータの単体テストを作成するのに使うことができます。 –
この文脈で私のために「自己完結型」を定義しなければなりません。それは自己完結しているという意味で、そのすべてがRustで書かれています。そのファイルは1ファイルではないという意味で自己完結型ではなく、 'lexer.rs'、' parser.rs'、 'token.rs'、' assembler.rs'ファイルの型に依存しています。あなたが依存関係として使用して使用するのに十分単純でなければなりません - あなたの特定のユースケースを知らなくてもそれを言うことができます。アセンブラは、6502ニーモニックコードを入力として解析するとき、(現在)非常に制限されています。たとえば、いくつかのアセンブラーのように空想的なマクロや条件付きの構造体はありません。 –