RPG等のゲームでは、描画処理や当たり判定等をJava/C/C++等の言語で実装す る一方、独自実装のスクリプト言語にイベント(例えば主人公が自動的に任意 の場所へ移動する等)を記述することが多いと思います。 Javaでスクリプト言語を実装するのに有用な、コンパイラコンパイラである JavaCCを使用します。
1. osx portのjavacc
下記コマンドでJavaCCは入手できますが。
$ sudo port install javacc $ javacc Java Compiler Compiler Version 6.0_beta (Parser Generator) <snip>
どうも実行してみるとVISITOR=trueが上手く動作しませんでした。
/** Accept the visitor. **/ public Object jjtAccept(ExprParserVisitor visitor, Object data) { return visitor.visitHoge(this, data); #visitor.visitになってほしい }
javacc-5.0にバージョンをダウングレードしてみます。
2. ダウンロード
JavaCCのダウンロードページからjavacc-5.0.tar.gzをダウンロードします。 ファイルはjavacc.jarとスクリプトファイルなのでコンパイル作業は不要です。
3. インストール
javaccというスクリプトファイルがカレントディレクトリ配下のlibに javacc.jarが格納されていることを期待するので、javaccとjavacc.jarは同一 ディレクトリ配下に格納します(javaccを書き換えればこの限りではありませ ん)。私はPATHが通っているホームディレクトリ配下のbinに格納しました。
$ tar zxvf javacc-5.0.tar.gz $ cp -a javacc-5.0/bin/* ~/bin/ $ javacc Java Compiler Compiler Version 5.0 (Parser Generator) <snip>
4. Androidで簡易な電卓
CodeZineのサイトでは電卓用のコードが公開されています。 javacc3sample.zipのexpression4を使用して、Androidで電卓を作成します。
javaccのディレクトリを示す変数のjavacc.dirを先ほどインストールしたディ レクトリに変更します(user.homeはホームディレクトリを示す変数です)。
--- build.properties.org 2014-04-09 09:57:48.000000000 +0900 +++ build.properties 2014-04-09 09:56:34.000000000 +0900 @@ -1,4 +1,4 @@ -javacc.dir=C:\java\tool\javacc-4.0 +javacc.dir=${user.home}/bin/lib src.dir=src build.classes.dir=build/classes
以下のようなActivityを作成します。
(上) EditText 1+2等の式を入力するフィールドです。 (中) Button EditTextの文字列を取得し、CodeZineの電卓用コードを通して計算を実行し ます。計算結果をTextViewの文字列に設定します。 (下) TextView 計算結果を出力するフィールドです。
コードは以下の通りです。calc()メソッドのExprParser parser = ...以降で CodeZineの電卓コードに処理を任せます。
public class MainActivity extends ActionBarActivity { private LinearLayout mLayout; private Button mButton; private EditText mEditText; private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mLayout = new LinearLayout(this); mLayout.setOrientation(LinearLayout.VERTICAL); mEditText = new EditText(this); mLayout.addView(mEditText); mButton = new Button(this); mButton.setText("calc"); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { calc(); } }); mLayout.addView(mButton); mTextView = new TextView(this); mTextView.setText("none"); mLayout.addView(mTextView); setContentView(mLayout); } public void calc() { String question = mEditText.getText().toString(); if (question.length() == 0) return; Log.d("calc", question); ExprParser parser = new ExprParser(new StringReader(question)); Expr visitor = new Expr(); try { ASTStart start = parser.Start(); String answer = ((Integer) start.jjtAccept(visitor, null)).toString(); Log.d("calc", answer); mTextView.setText(answer); } catch (Exception e) { e.printStackTrace(); mTextView.setText("NaN"); } } <snip> }
起動すると以下の画面のようになります。CodeZineのコードは括弧、演算子の 優先順位もケアしてくれるため、関数電卓のようになります。