6802用アセンブラを作る(2) JFlexとCUPの導入

6802用アセンブラの構文解析部分を、将来の拡張性を見据えて、自前で作成するのではなく字句解析にJFlex、構文解析にCUPを使って作成することにしました。この記事ではそれぞれの導入と、それらを使った構文解析部分のプロトタイプを紹介します。

インストール

以下の環境にインストールするためのメモを記します。

  • Windows 10
  • Eclipse Version Mars.2 Release 4.5.2

JFlex

ダウンロードページからtar.gzまたはzipファイルをダウンロードし、適当な場所に保存します。2017年2月26日現在、最新版は1.6.1。tar.gzもzipも内容は同じです。
以下ではc:\tools\jflexに展開したものとします。

Eclipseだけで開発する場合は不要ですが、DOSプロンプトから実行する場合も想定して、展開してできたフォルダ内のbin/flex.bat (今回の例ではc:\tools\jflex\bin\flex.bat)を自分の環境に合うように修正します。修正箇所は環境変数の設定部分です。

JAVA_HOMEの行はJDKのあるディレクトリ、JFLEX_HOMEはJFlexを展開したディレクトリに合わせて変更します。
必要に応じて上記のbatファイルの場所を環境変数PATHに追加してください。

CUP

ダウンロードページからtar.gzファイルをダウンロードし、適当な場所に保存します。2017年2月26日現在、最新版はjava-cup-bin-11b-20160615。
以下ではc:\tools\cupに展開したものとします。

CUPをインストールして試そうとするとUnsupported major.minor version 52.0が発生することがありました。CUPはJava 1.8が前提なのかもしれません。ここの原因究明は深入りせず、今回の開発環境はJava 1.8に統一しました。

Eclipseの設定

JFlexとCUPのソースコードとJavaコードの生成先をどこにするか悩み、次のようにしてみました。

Eclipseのワークスペースのソースフォルダ直下に.flexと.cupを配置し、これらを処理して生成される.javaファイルを自作ソースコードのあるパッケージフォルダ(パッケージ名がjp.asamomiji.assemblerなのでjp/asamomiji/assembler)を指定しています。自作ソースと自動生成ソースが同じ場所に混在するのがちょっと汚いのですが…。

次にAnt用のbuild.xmlを作成します。

ポイントは、JFlexとCUPから生成されたJavaコードをもとに全体をビルドする必要があるため、compileタスクで明示的にJavaソースコードのコンパイルを実行しているところです。その他、パス名は自分の環境に合わせて修正してください。

さらにJavaのビルドパスに、外部JARとしてCUPのランタイムライブラリ(java-cup-11b-runtime.jar)を追加します。

最後にEclipseにCUP用プラグインを追加します。ダウンロードページの指示にしたがって、Eclipseの「ヘルプ→更新ソフトウエアのインストール」からインストールしてください。

JFlex用のプラグインは無いみたいです。。。一応cup-lex-eclipseというのが見つかってはいるのですが、うまくインストールできませんでした。

サンプル構文解析コード

字句解析 (AsmScanner.flex)

昔ながらのlexやGNUのflexを触ったことのある人なら、書式はそれほど難しくないと思います。JFlexはCUPとの連携をするための構文が用意されているので、CUPを使っておけば楽できそうです。

で、昔ながらのアセンブラの書式だと、数値の表現方法が今どきから見るとちょっと特殊です。

  • $1000    (‘$’を前置すると16進数)
  • 1000H   (‘H’を後置すると16進数)
  • %00101111 (‘%’を前置すると2進数)
  • @0777 (‘@’を前置すると8進数)

これに、”0x”を前置したら16進数、みたいな規則もやはり欲しいので、この辺りの処理に手間取りそうです。

 

構文解析 (AsmParser.cup)

こちらの方はyaccやbisonとは若干書式が異なりますが、それらを使ったことのある人には特に難しくはないと思います。書式で苦労するよりも、むしろ構文のデバッグの方がはまるでしょう。こんな短い構文でも、シフト・還元衝突の解決に時間を費やしています……。

次に向けて

次は字句解析・構文解析系を完成させようと思います。もう少し詳細なコードの説明は次回に。

これまでの記録

 

投稿者: kemusiro

プログラミング、サーバ構築、電子工作、旅行が好きです。

コメントを残す

メールアドレスが公開されることはありません。