インストール(42404)↑MenuBarここでは、Yahoo!Financeの株価時系列データをJavaCCで解析します。†BNFなどで示される、ある文法に則って書かれた文章を解析するプログラムを作るためのプログラムです。プログラムを作ります。http://www.cs.ucla.edu/~palsberg/jtb/。文の上に出現する記号です。配下に非終端記号と終端記号を持ちます。http://www.rfc-editor.org/rfc/rfc2234.txtEBNFプロトコルの定義などで、その定義を行うために独自にBNFを拡張している場合がある。†JavaCCのインストールhttps://javacc.dev.java.net/から、javacc-3.2.zipをダウンロードして適当な所に展開します。以下にコピーしました。JTBのインストールhttp://compilers.cs.ucla.edu/jtb/から、jtb132.jarをダウンロードして適当なところに展開します。以下にコピーしました。JavaCCプラグイン取得http://perso.wanadoo.fr/eclipse_javacc/から、rk.eclipse.javacc_1.3.1.zipをダウンロードします。ない)で、javacc.jar、jtb132.jarのフルパスを設定します。†JavaCCプログラムは*.jjファイルに記述します。jjファイルは以下のような構成になっています。コンパイラ・コンパイラとなるクラスの設定をします。無視して読み飛ばされる字句を定義します。構文を構成する字句を定義します。文法に関係無くどこにでも現れる可能性のある特殊な字句を定義します。見つかった構文に対する処理を記述します。Codeを書きますここでは、Yahoo!Financeから取得したHTMLを解析し、株価時系列データを取得するために、テーブルタグの内容<TABLE><TR><TD>〜</TD></TR></TABLE>を切り出すjjファイルを作ります。†HTML文書のTABLEタグの内容を取得するHTMLTableParser?.jjを作成します。ここではとりあえず<TD>タグの中身をSystem.outに出力します(データの取り込みは後述するJTBを使ってこのプログラムを拡張して行います)。<OPTION>OPTION部では、JavaCCがJavaプログラムを作る際のオプションを指定します。trueにすると生成されるメソッドがstaticになります。Escapeされた文字が入力されると見なします。trueにすると、ParserはUCS2(つまりはJavaのString型)が入力されると見なします。false<PARSER_CLASS>PARSER_CLASS部では、JavaCCによって生成されるクラスを定義します。import宣言やフィールド変数、コンストラクタなどを定義します。HTMLTableParser{}PARSER_END(HTMLTableParser)<SKIP>SKIP部では、無視して読み飛ばされる字句を定義します。無視して読み飛ばされるもの。空白、タブ、改行文字など。"\f">}<SPECIAL_TOKEN>文法に関係無くどこにでも現れる可能性のある特殊な字句を定義します。基本的には無視する字句を定義します。"</div>">}<TOKEN>TOKENには、構文を構成する字句を定義します。>}<PARSER_METHOD>いよいよメインディシュです。TOKENによって構成される構文を定義し、見つかった構文に対する処理を記述します。TOKEN}というように定義します。TOKENを受け取るにはTokenというオブジェクトを使います。ここでは、htmlを処理するメソッドから始めます。任意のメソッドの定義。トークンとも構文とも無関係な任意のJavaコードを書き込みます。Pluginにより自動的にJavaCCが起動されJavaコードが生成されます。次のコードは、Yahoo!Financeから、8035.t(東京エレクトロン)の時系列データを読み出す例です。ファイルから、構文木を生成するようなjjファイルを作成します。Javaプログラムjjtファイルの作り方jjファイルの拡張子をjjtに変換します。jjtThisオブジェクトとして扱われます。よりソースコードが自動生成されます。{}{<HTML><HEAD><TITLE>外部からはこのメソッドを呼び出すようにします。");jjtファイルをセーブ(ctrl+s)すると、jjファイルと構文木生成プログラムが生成され、さらにjjファイルから構文解析プログラムが生成されます。実行すると構文木が出来ています。tableSimpleNode?を拡張し、構文ノードのデータを埋め込むSimpleNode?の構造SimpleNode?は一種の双方向リストになっています。各SimpleNode?は、一つのparentと複数のchild(children[])を持ちます。SimpleNode?にデータ格納領域を作る。オブジェクトとして参照することが出来ます。そこで、SimpleNode?にデータを格納するフィールド(内部変数)を作ってやって、構文解析メソッド中でデータを埋め込んでやれば目的を達成することが出来ます。(変更点)ここでは、テーブル連番・テーブルに格納されたデータ(URL・テキスト)を格納できるようにSImpleNode?を拡張します。SimpleNode?#dump()でノードの内容を表示するようにSimpleNode?#toString()に手を入れてやります。分割による調整については、を参照してください。株価時系列データ(次の50件)へのリンクそこで、生成された構文木をたどってn番目のテーブルを探し出すプログラムを作ってやれば構文木から株価データを取得できます。ここでは、1000日分の株価をMapのCollectionとして読み出します。連続して読み込むとYahooから接続拒否されてしまうので、1ページ(50日分)読み込む毎に100ms休憩を入れています。sec.ISBN10ISBN139784061426061。