協調学習のススメ

アイディアソンの中で、教育というテーマで議論することが多かったので
前回の記事で別に分けた協調学習というテーマで今回は書きたいと思います。
人に何かを教えるときに気をつけたい3つのポイント - pokotyamu的書きなぐり日記
最初に、東大の大学院の方のブログを参考に学問的な定義をまとめた上で、
自分の体験からどんな学習効果があったかという体験談の形で進めていきます。

学問的な定義



blog.iii.u-tokyo.ac.jp
blog.iii.u-tokyo.ac.jp
2つの記事をまとめると、
協調学習とは、

学習者がグループ活動の中で互いの学習を助け合い、一人一人の学習に対する責任を果たすことで、グループとしての目標を達成していく、協調的な相互依存学習

のことで、家庭教師や塾のチューターように一方の利益のために勉強することは含みません。
これによって得られる成果としては、

・学業成果(成績)
・対人関係(コミュニケーション能力)
・動機付け(モチベーションの維持)
・批判的思考やメタ認知的思考

などなどが挙げられます。

難しいことを言ってますが、要するに
試験前にみんなで図書館で集まって個人で勉強するのではなく、
ノートを持ち寄って、互いに得意な分野を教えあいながら、勉強していくことで成績の向上はもちろん、対人関係の向上や、人に教える責任感も含めて効果として求め、個人で勉強する以上の効果を期待する学習スタイルです。

PS①:かなり割愛していますので、詳しく知りたい方は原文を読んでください。
PS②:間違いあればコメントいただけると助かります。

実際に協調学習してみて感じたメリット



今回留学期間中に行ったアイディアソンについて紹介と感想について書いていきます。
どんなアイディアソンをしたかについては過去記事を見てください。

知識の学習法のパスを知れる

もし、新しい分野を勉強する時どのようにしますか?
参考書等を買って勉強するという方法も考えられますが、協調学習で勉強していくことでその人の持ってる知識に加えて様々な知見を得られます。
例えば

・どのように勉強したか?
・実際に使ってみた時の体験談
・その知識について、その人の考え方(意見)

このような副産物も込みで得ることが出来るため、
最終的な学習スピードが上がるように感じました。

今回の場合は「ビジネス」というワードに対して経営・経済系の学部の子に教えてもらったのですが
1人で勉強する上でどのように進めていこうかという方針を固めることが出来ました。

自分の知識が整理される

私は、一番効率がいい学習方法は「人に教える」ことだと思っています。*1
その理由は、

・人に教えるために再度知識を復習する
・責任が発生するので下手なことは教えれない
・ロジカルに伝えないと伝わらないので、文章構成のトレーニングにもなる

などが挙げられます。
協調学習では、教えあうことがベースになるため
必然的に教える機会が増え、高い学習効果が期待出来ると考えています。

ゴールを決めれる

個人でするよりも確認出来る人がいる分、
今日はどんなことを学ぶというゴールが設定しやすい気がしました。
さらに、そのゴールに向かう途中で話が脱線して別の議論に波及することで、
別な考え方も身につける事ができる可能性があります。

たまに脱線しすぎて、本来のゴールまで辿り着かないこともありますがね笑

コミュニケーション能力の向上

これは人によるのですが、
私は誰かと会話してコミュニケーションを取るのが好きなので
会話前提で学習が進む協調学習が向いているのかも知れません。
恐らく気がしれている間柄でやることになると思うので、
先生よりとことん理解できるまで質問攻めに出来るのもメリットと思っています。

質問することで、相手の知識の盲点を付くことが出来るかもしれない。
それによってさらに教えている側も勉強になっていて、学習効果が期待できる。
このような流れで進んでいるのがこれの面白いところですね。
なので、遠慮なく質問していきましょう!

九州工業大学の取り組み



私は現在九州工業大学の大学院に通っているのですが、
2011年に協調学習の研究を目的として「MILAiS」という施設が作られました。
MILAiS:九州工業大学 情報工学部 未来型インタラクティブ教室

最後にこの施設について触れて終わりたいと思います。

議論しやすい環境

この施設には協調学習を円滑に進める様々な仕組みが施されています。
f:id:pokotyamu:20150915162349p:plain
まずは壁です。
4つの壁全てにホワイトボードがズラーっと設置されています。
もちろんそのままも使えますが、取り外して移動することも出来ます。
さらにそれぞれにプロジェクターが備えられており、生徒が希望すればいつでも使用出来ます。

次に机です。
勾玉上に設計された机では、人数に合わせて机の広さを変えることが出来ます。
これも協調学習としては重要で、机が広すぎて議論しにくかったり狭すぎるということを防いでいます。
各テーブルに充電ケーブルを引けますし、飲食も可能です*2

端末の貸出

MILAiSではMBAiPadなど様々な端末を借りることが出来ます。
プログラミングを勉強する上で簡単にスペックの高いPCが借りれるのはありがたい。
例えば端末を忘れたという時でも駆け込みで使えます。

質の高い情報が集まる

ここからは私の体験なのですが、
協調学習でモチベーションが高まっている学生が集まっているため
他のグループから刺激を受けることが頻発します。
頻繁に利用してたらお互いに知らなくても顔覚えますしね。

やっぱりこの環境でつながった人は尖っている人間が多かったように感じます。
尖っている人間は、他の世界から情報をキャッチしてくる。それをこの環境で広める。
そんなループが回っているような感じがしています。

まとめ



最後の方は、大学施設の話になりましたが、
今回は協調学習についてまとめました。
本文の中ではメリットを中心に書きましたが当然デメリットもあります。
それは、相手のスキルセットに依存してしまうため
間違った情報を入れてしまう可能性があるということです。
これは自分が与える情報についても同じです。

これを防ぐためには、まず自分の与える情報の質を高めることがあります。
ギブ・アンド・テイクの精神がベースにあるため、質の高い情報をくれる人には、それに見合った質を持ってきてくれる人に出会える可能性が増えてくるように感じます。
さらに上のレベルの人と勉強できることをモチベーションにやるのも楽しいかもしれませんね。

*1:家庭教師をやっていた時も生徒に先生役をやらせて公式の証明を説明させたりしていました。

*2:臭いインスタントや缶コーヒーは例外だったはず

人に何かを教えるときに気をつけたい3つのポイント

留学4週目の更新。

最近は、シリコンバレー界隈でウリウリやってる学生で集まって
1週間に5回ほどアイディアソンやってみました。
Workshop Cafeにほぼ毎日お世話になっております。
Workshop Cafe - サンフランシスコ - 喫茶店、職場・オフィス | Facebook

f:id:pokotyamu:20150823183737j:plain

アイディアソンと言っても内容はその時々で変えて

・個人が持ってるアイディアのブラッシュアップ
・◯◯ ✕ ◯◯ を20個出すまで帰らない
・ダイレクトマーケティングをテーマにビジネスモデルを考える
・日本とシリコンバレーの働き方の違いについて議論

とか色々でした。

面白い点としては、集まったのがエンジニアとして勉強した人だけではなく
経営系を中心に勉強している人など、違うバックグラウンドの学生だったことです。
そのため、いかに専門性の高い言葉を相手にわかりやすく教えるか?ということが求められてきます。

このようにグループワークで勉強していく時の体験は、
協調学習のススメという記事でまとめる予定なので、そちらも合わせてご覧頂ければと思います。*1
というわけで、今回の体験から感じたことを
人に教えるときに気をつけたい3つのポイントという形でまとめていきます。

1.知識レベルが違うことを意識する



前述したとおり、バックグラウンドが違うということは
知識レベルにおいて差が生まれているので、相手に教えなければならない状況の場合
1歩2歩階段を降りて会話をする必要があります。

大学教授の講義がつまらないと感じるのは、この部分が大きいのかもしれません。
かといって、大学教授が自分のレベルを落とすことはしない。
そのため、学生が主体的に埋めようとしない限り、いつまで経ってもつまらないと感じるのだと思っていると私は考えています。
*2

2.PREP法を利用してみる



これは人に何かを伝える時にロジカルに話すポイントでもあります。
PREP法とは、

P・・・Point(結論)
R・・・Reason(理由)
E・・・Example(具体例)
P・・・Point(再度、結論)

の略で、この文章構成で人に物を伝えることも効果的です。

具体的な例を挙げてみます。

A「この公式はよく使うから覚えとけよー!」

B「この公式は絶対に覚えとけ!」
 「なぜなら、センター試験の大問1で頻出だからだ!」
 「去年、一昨年とどちらもこの公式を使えば解けた!」
 「だからこの公式は絶対に覚えとけ!」

AさんとBさんの会話を比べた時に、言葉数が多いのもありますが、説得力という面では
Bさんの方が強く重要性を伝えることができています。
これは教えるときだけでなく、何かを質問するときにも使えて、

A「このバグが取れないんですよね...」

B「このバグの取り方がわかる調べ方を教えて欲しいです。」
 「なぜなら、自分の知ってる知識を使っても取れなかったからです。」
 「このテストを書いてみても、変数を固定にしてもわかりませんでした。」
 「だから調べ方を教えて欲しいです。」

いかがでしょうか?
Aさんの質問の仕方をしてしまった場合、相手はなにが問題なのかわかりません。
自分の意図する答えが返ってこない可能性がありますし、
相手が知らなかった場合、無駄に考えさせるこにもなります。

実際に、ここまで厳密に構成を守りながら話すのは難しいのですが
予め準備出来る場合、この考えに基いて話を整理するのをおすすめします。

3.説明は3分でまとめる



せっかく話の構成が上手く立てられていても、ダラダラと話し続けられたらどうでしょうか?
きっと途中で相手の集中力が切れてしまい内容理解が難しくなってしまいます。
しかし、全ての会話をコンパクトに纏めることは難しいのも事実です。
これを解決する方法としては

・相手に考えさせる時間を与える
・相手に質問を聞いてみる

といった相手に投げかける方法を試すと飽きずにすすめることが出来ます。

相手が何をどれだけ知りたいのか?に合わせて話のボリューム感を決定し、
分からないことや質問を相手に投げかけながら進めていくことで、人に教えるときの上手さが向上するヒントかもしれません。


最後に、これまでの話は私のこっちでの体験や、インターンでの経験がもとになっています。
この話し方が合う合わないもあるので、1つの参考として、考えて頂ければ幸いです。

*1:後日更新予定

*2: 大学の講義は興味を持つためのフックという考え方もできるので、一概にダメだというつもりもない。

英語が満足に話せるわけではない私がシリコンバレーの勉強会で名刺渡しまくった話

留学3週目の更新。

今週は、SFRailsに参加してきました!
イベントのリンクはこちらwww.meetup.com
今回の会場は、きれいめなオフィスの一角でした。
f:id:pokotyamu:20150821132446j:plain

前回はどっちかといえば経営層の人が多かったがこっちは基本的にエンジニアかデザイナーの人しかいなかったです。
前回記事pokotyamu.hatenablog.com

ーー
今回は、そんな中で大した英語力のない私がどう立ち回ったか?という話をまとめていきます。
これから同じ境遇になる方、なかなか会話のキッカケが掴めない方の参考になれば。
日本のエンジニアの懇親会でも共通の部分もあるので、もっとこんなことしたらいいよ!などありましたらコメントで教えていただけると助かります。

1.初対面のきっかけ作り

まずは、いかに話し相手を見つけるか?という点についてです。

飯を食わずにビールを飲む

これにはいくつかの利点があります。

・空腹にアルコールを入れることで、酔いを早くする

これによりボッチの緊張感や英語が話せない恥ずかしさを軽減させることが狙いです。
むろん、酔いすぎて相手の話を聞けなくなるのはもってのほかです。
ビールが色々あったのでオススメを聞いてみることで、会話を始めるというのもよかったです。
What's your recommendation?
迷った顔してこのこれぐらいのシンプルな英語で聞いたら
快く教えてくれますよ。

・乾杯という話はじめのきっかけが出来る

ビール片手に話しかけやすそうで、まだ話し相手がいない方を見つけましょう。
見つけたら、その人に目線を合わせてニッコリしながらビールをちょい高くあげましょう。
乾杯に応じてくれない方はいないので、これをきっかけに話しはじめるといいです。

下に書いている避けるべきポイントの人より、話し相手探してる感じの人の方が
実際話しやすかったです。

2.話はじめの会話

さぁ話し相手が見つかったなら次のステップです。
実際に会話する時の場面に移ります。

・あえて自己紹介をしすぎない

会話はキャッチボールという言葉もありますが
1人でベラベラ話すより、相手から聞いてもらうというのが長続きする秘訣かもしれません。
最初の会話で言うことは
・名前*1
・自分が大学生/社会人であること
・日本人であるということ
なぜ日本人であることを言うかというと、中国人や台湾人に間違えられている可能性があり、
日本人であるというだけで、相手の表情がかなり変わった印象があったからです。
これが日本人の海外における評価なのかもしれません。

また、英語が苦手な方に向けては
I study English now.
この一言をつけるだけでも相手の話し方を変えてくれます。
日本でも頑張って話そうとする片言の外国人の話は文法めちゃくちゃでも聞くし、ある程度補完もすると思いますが、それの逆バージョンだと想像してみてください。

・自己紹介シーンでの注意点

Ruby歴やどんな言語を書けるか?どんな仕事(研究)をしているのか?ということを不用意に言わないことです。
これらは後々の会話のネタになるので、最初のアイスブレイクは日本の話題や、どれくらいこっちにいるの?的な話しやすい話題で始める方が私は話しやすかったです。
自分から言わなくても向こうから聞いてくれますし、
How about you?
で会話を相手に振れますしね。
最初に話してしまうと、ここの話を放ったらかすと、いきなり専門性の高い話に移行してしまうので、オススメしません。(体験談)
日本に興味を持ってるアメリカ人は多いので、桜の写真や富士山の写真を見せるだけでも
Pretty coooool
って興奮してくれます笑

3.専門性の高い話になった時

アイスブレイクも終わって、いよいよ専門性の高い話になった時の立ち回りです。

・自分ではなく相手に話してもらう

今までの会話の中である程度打ち解けていたら、自分がどれぐらい英語を話せるかを相手も理解してくれます。
懇親会の会話はgive and take ということもありますが、相手に質問しこちらがその回答に対して会話を続ける方が続けやすかったです。
アドリブで思い浮かばない人は事前に質問を用意しておくのもいいと思います。*2

・話す時は相手の目を見て話す

時には言葉より気持ちで気合いで伝えることが必要な場面も出てきます。
もしその時に携帯見ながらとか話すのはNGです。別にこれはアメリカに限った話でもないですがね。

言葉が拙い分は目で訴える!!笑
日本人と会話する時の200%増しでリアクションするといいです。
イメージはアナとかのディズニーキャラですかね。
f:id:pokotyamu:20150822153958p:plain
長い文章を話す必要はなく、短めの文章を連発させてもいいと思います。
無理に関係代名詞を使って2つにまとめたりせずゆっくりはっきり一文ずつ伝えることの方が遥かに大事です。実際その方が話しやすいですしね。

4.絶対に避けるべき行動

最後に、これやってるとぼっちになる可能性がある人の注意点を2つ

・隅っこに座ってPCカタカタorスマホいじいじ

こっちの人はフレンドリーな方が多いので、話しかけられて嫌な顔する人はいません。
スタバや電車で座ってて、いきなり隣の人から話しかけられたりもする環境です。
仕事だったら仕方がない部分もありますが、立っているだけでも話しかけてくれたりします。

・pizzaをひたすら食ってる

Nice to meet you
と言いながら握手で始めるのが基本なので、
食べたい気持ちはわかりますが、握手は出来るように気をつけていた方がいいと思います。
それ以上に飯食ってたら話しかけにくいし自分もしゃべれないですしね笑


===
最後にイベントの感想として
Emacs vs Vim世界共通だった。
以上です。

*1:日本人の名前はよびにくそうなので一工夫あってもよかった

*2:筆者も大小10個ぐらい用意していました

シリコンバレーのstart up pitch festに参加してきた

留学2週目のまったり更新

今週はSVE East Bay Pitch Fest - Patents and Reportersに参加してきましたので、その感想をまとめていきます。www.meetup.com

そもそもPitchって?

近年、日本でもちょこちょこ目にするようになったPitchコンテストですが
投資家の目の前で2分前後(今回は2分でした)で自分たちが投資して欲しい事業についてプレゼンを行うという資金調達のための出会いの場見たいなものです。
ここで投資家の目に止まれば後日話しがあったり、その場でお金が動いたりするわけです。
今回のイベントではこんな感じ
f:id:pokotyamu:20150812190759j:plain

何を話しているのか?

私が見ている限り、全てのプレゼンが以下の4点について話されていました。

  1. 自分たちの事業でしか解決できないとする問題
  2. 自分達の事業についての紹介
  3. 市場価値、ビジネスモデル
  4. チーム構成

1.自分たちの事業でしか解決できないとする問題

現状の問題点と現在のシステムや環境では、いかに問題があるかを述べて自身の事業の売り込みを行う。
これは、どこの国でも一緒ですね。
ただ、絶対に自分たちの事業でしか解決できないというのを数値的に強調しているのが印象的でした。
比較対象は、類似アプリ(ex:SNS系ならFBやinstagram)や社会情勢(ex:アフリカの経済事情)など、様々な角度から比較していました。
いかに今までの日常にはない当たり前を作るか?という点がキーワードのような気がします。

2.自分達の事業についての紹介

2分という限られた時間の中でいかに簡潔に1の問題を解決できるか?
どのような手法で解決していくのか?
という点に注力して、まとめられており、どのプレゼンも熱量がすごかった!
デモがある人は、口頭だけで行っていたり
プレゼンテーションのやり方も人それぞれでしたが、皆さん堂々と話していました。

堂々と話すという点について少し補足すると

  • 使っている英語が私のリスニング力でも理解できるほどのシンプルさでまとめられている
  • 接続詞や話題の変わり目(However,But,So,Because)を強調して、言葉に力を入れる

この2つが要素のような気がします。
個人的に強調については、ステージパフォーマンスのMCに通づるものを感じました。

3.市場価値、ビジネスモデル

予測される利用するユーザー数、単価、市場としてどのくらいの価値があるのか?
現状の価値と3年、5年、10年のスパンでどのようにスケールしていくのか?
という点について、こちらも数値で提示していました。
あと、ビジネスモデルについても必ず述べていたのですが、私自身が勉強不足で単語の意味が理解できませんでいた。
「ビジネスモデルは○○です」ぐらいの形で話されていました。

日本で見た時と違うと感じた部分は、

  • 市場規模が、国レベルで考えられている
  • 既にアクティブユーザーがある程度付いている

という点です。
ローカルにとどまらず、いかに広い市場で動いていけるか?が大事だと考えられます。
実際、この2つを満たしている人がコンテスト上位に挙がっていました。

日本でも同じことが言えると思いますが、現実味の違いなのか?自分が見た時がたまたまだったのか?
同じような熱量や魅力を感じることは出来ませんでした。
これについては、サンプル数が少ないので、深くは追求しないことにします。

4.チーム構成

スタートアップは事業以上にチームが大切という話はよく聞きますが
必ず自分のチームメンバーについても触れています。
時間は短いですが、こんなにFunkyなやつなんだぜ〜とか色々w
バックグラウンドもですが人柄について話している方が多かった印象。
その場でエンジニアやデザイナーを募集する方もいました。

生で見ての感想

せっかくなので隣の方と色々話してみたんですがPitchで成功するためには、
市場価値をいかに具体的に投資家に示せるか?
ということがポイントのようです。
また
Pitchじゃなくて自分で資金を作ってやった方がいい事業もある
ということも教えてもらいました(日本から来た学生と言ったら優し目に教えてくれたので助かった)。
Pitchはガソリンのように加速させることはできるけど、投資家のおもちゃにされる諸刃の剣のような部分もあるってことなのかな?
就活の時に受けていた社長さんとの面接やお話させていただいた時にも似ている話を聞いたのを思い出しました。

また、同世代や恐らく年下の人もプレゼンしていて、そこからの刺激が一番大きかったです。Draper Universityの学生も発表していました。
今自分のやっている事業を成功させるために振りきって日々を過ごしている。
自分に足りない部分はここというのをすごく感じました。
あとは勉強できるだけの英語力ですね...精進します!

プレゼンでは教授と学生の研究のマッチングを行うsignup.mykubby.com
が自分が学生ということもあり、聞いてて面白かったです
ただ、市場価値的な問題で、ウケてはいなかったかなぁ。

最後に優勝した方の事業

Cloud Based Two Factor Authentication | SAASPASS
自分のiPhoneApple Watchが近くにあるときに、アプリからMacのロックや様々なパスコードが外れるという内容です。
確かに自分がPC使うときには携帯近くにあるしなーとは思いつつ。
電話番号が必要らしく、こっちで試すことが出来ないので、試した方いらっしゃれば、感想教えてください笑
f:id:pokotyamu:20150816143944p:plain
具体的なアドバンテージの示し方の一例を出したところで、今回は終わりにしたいと思います。

外国リーグで活躍する日本人のお陰で友達が出来た話

サンフランシスコ留学1週間終わりました。
pokotyamuです。
1週間経ってみて色々な体験談をまとめていきます。

まずは、サンフランシスコの気候から
こっちの気候はほぼ毎日晴天で、日中も25〜6度
日本の10月ぐらいの天気が続いています。*1
なので、基本的に長袖か、ジャケットを着て生活しています。
思った以上に寒いです笑
f:id:pokotyamu:20150803084148j:plain


そんな私も語学学校で1週間経って、少なからず外国の友達も出来ました。
台湾や韓国などのアジア系も多いですが、ヨーロッパやスペインの方もいました。
無論、英語で会話することになるのですが、初対面の場合
"What's your name ?"
"Where are you from ?"
"How long do you stay here ?"

この3つから始まって、次に
"How old are you?"までがテンプレな印象ですね。

この後の会話をどうつなげるか?
というのが重要な気がしているのですが

トルコ人のイケメンさんと友達になった時に
"Do you like soccer ?"と聞かれ
"Yes, Do you know Keisuke Honda, Shinzi Kagawa ? "
といった形で海外リーグで活躍する日本人をあげると打ち解けやすかったです。
彼いわく、
"Keisuke Honda is the best Japanese player"だそうです笑

幸いにも、サンフランシスコ・ジャイアンツ青木宣親が大活躍中なので
こっちの人とのコミュニケーションの中では彼の名前をよく出してます。

日本にいる時は、単に外国人選手の活躍をスポーツニュースで見るだけですが、
コミュニケーションの1つのきっかけとして使わせてもらったので、
彼らの活躍のお陰で友達が出来たと言っても過言ではないかなぁと思っています。


まだまだスムーズに会話するまでには至っていませんが*2
どうにかこうにか頑張って生きています笑
このブログに勇気づけられつつ来週も頑張ります!maeharakazuhiro.com

*1:夏場は1ヶ月に1~2日しか雨が降らないそうです

*2:ホストマザーに正確な英語を使いなさいと矯正中

コンパイラつく〜ろ〜♪ 4番JavaCCの記述

しばらくぶりですが、やっと知識的に整理ができたので
更新したいと思います。

前回記事pokotyamu.hatenablog.com

2番目の記事で導入までは終わらせているので、
今回は実際に使っていく時の書き方に対してまとめていきます。pokotyamu.hatenablog.com

1.JavaCCとは?

Java用のパーサジェネレーター兼スキャナジェネレーターです。
「.jj」の拡張子ファイルに文法規則を記述することで
入力に対して、文法の解析を行い、それぞれに適した処理を与えることが出来ます。

記述ファイルの内容としては、

option{
     //JavaCCのオプション
}
PARSER_BEGIN(パーサクラス名)
package パッケージ名;
import ライブラリ名;
public class パーサクラス名{
  //任意のJavaコード
}
PARSER_END(パーサクラス名)
//スキャナの記述
//パーサの記述

となっています。
この時optionsのみ省略することが可能です。

2.記述例

まずは、optionsから。

options{
 STATIC = false;//全部のメソッドをstaticでない状態で生成する
    JDK_VERSION = “JDK1.7"
}

生成されるコードに対して、様々な条件を記述することが出来ます。

PARSER_BEGINからPARSER_ENDまでは、
普通のJavaコードのように書くことできるので今回は省略します。

次にスキャナ
JavaCCの<>で囲まれている部分は非終端記号で、次のように記述をしていきます。

SKIP :{
          " "
        | "\r"
        | "\t"
        | "\f"
        | "\n"
}
TOKEN :{
          <STRING: "String">
        |  <IDENTIFIERS: ["a"-"z","A"-"Z","_"](["a"-"z","A"-"Z","_","0"-"9"])*>
        }

SKIPでは、マッチした文字列に対して、スルーすることが出来ます。
TOKENでは、マッチした文字列対してトークンを形成して返します。<トークン名:パターン>
という形で書かれます。
優先度は記述した順に判定されるため、
Stringという文字列を読み込ませた時
TOKENの記述が先にSTRINGでヒットするため、STRINGでマッチするかどうか?という判定を行います。
パターンについては正規表現で書くことができ、

0回以上の繰り返し
("a"-"z")*

1回以上の繰り返し
("a"-"z")+

前者もしくは後者
  ("a"-"z")
| ("A"-"Z")


最後にパーサの記述

Token processName():{
    Token t;
}{
    t = <IDENTIFIERS>{return t;}
}

これをjavaccコマンドにかけると、

final public Token processName() throws ParseException {
    Token t;
    t = jj_consume_token(IDENTIFIERS);
    {  if ("" != null) return t;}
        throw new Error("Missing return statement in function");
}

というコードを生成します。

この2つのコードを比較すると、

返り値 メソッド名():{
     変数の宣言
}{
     JavaCCのコード
     {Javaのコード}
}

このように書くことが出来ることが分かります。
JavaCCのコードにおいて<>で書かれるものについては、TOKENで記述したものが対応します。
よって、返り値として、TOKENを返すことが出来ます。

以上が、主な文法記述のまとめです。
次回は、自分が経験したエラーについてまとめていきたいと思います。

コンパイラつく〜ろ〜♪ 3番BNF記法

前回記事pokotyamu.hatenablog.com

今回は
BNF記法」についてまとめていきます。

BNF記法とは

プログラミング言語の設計を行うために文法を定義するのに使うメタ言語の代表格
正式名称は「Backus-Naur From
HTMLやXMLの構文定義や通信プロトコルの定義にも利用されているとのこと。

1.形式言語

日本語や英語など、自然に発生していって必ずしも文法に従っていない言語のことを自然言語と言います。
これに対して、プログラム言語のように、厳格な文法によって定義される言語を形式言語といいます。
なので、今回のようにBNF記法で表せるということですね。

ここで、ノーム・チョムスキーが提案した形式文法のクラスを紹介します。
これらのクラスによって、複雑さを表しており、0型から3型に向かって制限が増えていきます。
f:id:pokotyamu:20150515004606p:plain

2.文法構文

ここでは、例題として数値を定義したいと思います。

<数値> ::= <数字列> | <符号><数字列> | <数字列>.<数字列>
<数字列> ::=  <数字> | <数字列> <数字>
<数字> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 
<符号> ::= + | - | ±

<数値>や<符号>のように< >で囲まれているものは「非終端記号」
0, 1, 2, +などの< >で囲まれていないものは「終端記号」といいます。
BNFは必ず、全ての非終端記号が、終端記号になるように設計する必要があります。

ここで::=や|の意味について説明します。

<A> ::= B AはBで構成されている。
<C><D> Cの後ろにDが続く。
E | F EまたはFで構成されている。

つまり、「3.14」は上の構文で表せますが、「3,-14」などは表せないことがわかると思います。

オレオレ言語のBNF記法作成の際に
Java言語のBNF記法を参考にさせてもらったので、そちらをそちらのURLを載せておきます。
Java BNF
実際のコードを頭に置きながら、このBNF記法を読んでいくと、
かなり理解しやすいと思います!

以上で、BNF記法の定義まで終わったので、次回からはいよいよ!
オレオレ言語のBNF記法で書いたものをJavaCCで実装していきたいと思います。