Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/yukihane/mavenize-language-implementation-patterns

書籍「言語実装パターン」サンプルコードのMaven化
https://github.com/yukihane/mavenize-language-implementation-patterns

antlr antlr3

Last synced: about 12 hours ago
JSON representation

書籍「言語実装パターン」サンプルコードのMaven化

Awesome Lists containing this project

README

        

## これは何?

書籍 https://www.oreilly.co.jp/books/9784873115320/[言語実装パターン] のサンプルコードを Maven 化し、 現代的な IDE にインポートできるようにするためのスクリプトです。

オリジナルのコードは https://ant.apache.org/[Apache Ant] でプロジェクト構成されていますが、 2022 年現在もはやメジャーなツールではないためコードをビルドするハードルが上がってしまっています。

このコードサンプルを Maven プロジェクトとして取り扱えるようにすることで、上記の問題を解消します。

## 使い方

### セットアップ

次のコマンドを実行します:

[source]
----
./mavenize.sh
----

オリジナルのコードはオープンソース的ライセンスではないようなので、オライリーのサイトから各自で取得するようにしています。

### 実行方法

基本的には、各ディレクトリに移動し、次のコマンドを実行します:
[source]
----
mvn clean compile exec:java
----

`-q` オプションを追加すると、 Maven が出力するメッセージを抑制することができます。

[source]
----
mvn -q clean compile exec:java
----

場合によっては追加の引数が必要です。
各ディレクトリの README を参照してください。

### IDE へ取り込む

TODO

## 書籍の説明箇所とコードの対応づけ

[cols="2", option="header"]
|===
|ページ
|ディレクトリ

|p.29
|parsing/lexer

|p.35
|parsing/recursive-descent

|p.39
|parsing/multi

|p.56
|parsing/memoize

|p.74
|parsing/antlr

|p.83
|IR/Homo

|p.85
|IR/Normalized

|p.87
|IR/Hetero

|p.99
|walking/embedded

|p.101
|walking/visitor

|p.105
|walking/tree-grammar

|p.109
|walking/patterns

|p.125
|symtab/monolithic

|p.130
|symtab/nested

|p.143
|symtab/aggr

|p.152
|symtab/class

|p.162
|semantics/types

|p.171
|semantics/promote

|p.176
|semantics/safety

|p.183
|semantics/oo

|p.199
|interp/syntax

|p.204
|interp/tree

|p.226
|interp/asm

|p.231
|interp/stack

|p.240
|interp/reg

|p.260
|trans/make

|p.265
|trans/wiki

|p.274
|trans/intro

|p.278
|trans/web

|p.280
|trans/ast

|p.283
|trans/ast-st

|p.290
|trans/sql

|===

## 付録

### オリジナルの Ant を使うには

`build-macros.xml` の 62 行目で Java のバージョンを指定していますが、 `1.5` と古いので、ここを更新すれば動作するはずです。

### ANTLR3.2 は Java8 に対応していない

ソースコードには `antlr-3.2.jar` が同梱されていますが、どうやら Java7 までにしか対応していないようです。

Java17 で実行すると次のようなエラーが出ました。
[source]
----
internal error: Can't get property indirectDelegates using method get/isIndirectDelegates from org.antlr.tool.Grammar instance : java.lang.NullPointerException
----
検索してみると、このバージョンは Java7 までにしか対応していないようです。

* https://stackoverflow.com/a/22367682/4506703

https://www.antlr3.org/download.html[公式サイト]から最新版(これを書いた時点では `3.5.3` でした)をダウンロードしてそれを利用する必要があります。

ちなみにコマンドラインでの実行方法はこちらに説明があります。

* https://theantlrguy.atlassian.net/wiki/spaces/ANTLR3/pages/2687267/How+do+I+use+ANTLR+v3+from+the+command+line[How do I use ANTLR v3 from the command line? - ANTLR 3 - Confluence]

### サンプルコードが ANTLR3 で実行できない

理由がわからないので Stack Overflow で質問しています。

* https://stackoverflow.com/q/73476914/4506703