1

HY.JavaCC (アセンブラー) を使用してアセンブリ コード (マイクロコントローラー 8051) からマシン コードに変換するパーサーを作成しようとしています。JavaCC の文法とその構造については読みましたが、ジレンマがあります。私はADD指示を持っています:

`ADD A,Rn`   or   `ADD  A,@Ri` 

そして、それらのそれぞれについて、私は Machine code (hex code)ex: ADD A,R0translates to 28H を持っています。また、私はMOV命令を持つことができます:
MOV A,RnまたはMOV A,@Riしかし、私も持ってい MOV data_addr,Rnます MOV R6,#data

今、私の問題は、2 つの命令の間でこの違いをどのように作成するかです。トークンを次のように 定義するとします。多くの命令があるため、特定の動作を指定する関数であるトークンごとに関数を定義できませんでした。少し、そう思いませんか....だから私はかなり行き詰まっています。どちらの道に進むべきかわかりません。 助けてくれてありがとう!
Token{
<IN_MOV :"mov">
|<IN_ADD:"add"
}

token.image==.equals("mov"), then go on one direction to the specific behaviour

4

2 に答える 2

3

レクサーに期待しすぎているようです。レクサーは有限状態マシンですが、パーサーはそうではありません。

したがって、レクサーは、命令 ( MOVADD、 ...) のトークンとオペランドのトークンを生成する必要があります。レクサーは、巧妙になりすぎて、特定の命令に対して特定のオペランドを期待するべきではありません。

これで、パーサーは命令とオペランドの特定の組み合わせを期待できるようになりました。たとえば@、命令でオペランドのみを受け入れることができるMOVため、他のオペランドは解析例外を引き起こします。

命令とオペランドの組み合わせをさらに検証する必要がある場合は、プロダクションのコードでそれを行う必要があります。たとえば、一部の命令では、2 つの同一のオペランドをエラーとして扱うことができます。これをプロダクションで表現するのは非常に困難ですが、コードでは些細なことです。

無効な一連の命令を検出するなど、さらに検証する必要がある場合は、プロダクション全体で状態を維持するか、解析が完了した後に AST を構築して処理する必要があります。

于 2011-03-15T15:39:41.977 に答える
0

アセンブラー コードのパーサーで記述する必要がある種類の多くの例については、この完全なアセンブリ言語文法を参照してください。

于 2011-03-19T17:36:14.367 に答える