言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

SmaCC 機能更なる検証

  • SmaCC で ggame のサンプル
    • greeting : hello world
      • greeting : "hello" "world" ;
    • expr : expr inc [ :a :b | a + 1 ]
    • expr : number
      • expr : expr "inc" { '1' + 1 } ;
      • expr : { '1' value asNumber } ;
  • ブロック構文、derivation 以外は可能。
  • SmaCC 文法はやっぱり難しい?
  • * と + を使ってみる (拡張BNF)
    • アクションが無ければ簡単
    • アクションの書き方は? 以下の場合、'2' には "inc" のOrderedCollection が入る。
    • expr ::= "inc" * { '1' value + '2' size } ;
  • 文法
    • まずは 9月 ggame と同じに
      • 行末の ; は廃止
      • 終端記号の "" は省略
      • スキャナは固定
    • 後で考える
      • 正規表現風 * + には別の表現を充てる?
      • グループ化は [] ?
      • アクション {}
      • アクションへの引数は シンボル名 + 番号
  • SmaCC 文法のコンパイル
    • 文法をチェックするフェーズと ( String -> SmaCCGrammar )
    • Smalltalk のクラスにコンパイルするフェーズに分かれる ( String -> SmaCCGrammar -> SmaCCScanner + SmaCCParser )
    • String -> SmaCCGrammar ( SmaCCGrammarParser>>parse ) は2回行う(チェックと本ちゃん)
  • RefactoryChangeManager とは何か? こいつのせいで遅い。
    • しばらく触らずにおこう。。。

SmaCCGrammar から文法をテキストに復元できるか? -> これは出来そう。

  • SmaCC に言いたい事。
    • SmaCCSmaCC の文法を編集できない。どうやって作ったの? 改造できるようにしておいてください! TGen では出来たのに! 本当にアランケイの薦めるだけの事はあるのか。。。
    • 具体的には のような構文すなわちスキャナと同時にコンパイルしないといけない部分です。以下のようにコメントアウトして回避
Term: |  {'' "grammar terminalSymbolNamed: '1' value ifAbsent: [currentToken := '1'. self reportErrorMessage: 'Token not specified']"}
    • コンパイル時スキャナも書き換えられてしまう事が判明! スキャナとパーサは一対一である必要がある。今までのわけの分からない現象はこれか?!ドキュメントに書いとけ!
    • エラーメッセージ不親切すぎ! T-Gen なら本当はこれのはずなんだけどと教えてくれる。

RSSとHTML

一見難しそうな文法が広まってしまったのはなぜかという話ですが、WYSIWYG の方が無条件に簡単だという考え自体が神話じゃないかと思う。いちいちビジュアル的な事を気にするくらいなら、テキストだけで済んだほうが簡単だ。と言う事を昨日民博で思った。文字は絵文字から表意文字へ進歩したのだ。WYSIWYG は原始時代への退行じゃないの?