ソースコードをツリー構造を持つオブジェクトとして解析したいと思っています。

汎用的なパーサー(?)や決まった手順があるんじゃないかと思っているのですが、知識不足で調べきれませんでした。
具体的にはZoho Creatorというサービスで生成されるコードです。
http://www.zoho.jp/service/zoho-creator.html
コメント欄にソースの先頭付近を書いておきます。
言語の知識も不足していて、何にもっとも似ているのか判断できません。
ライブラリなりヒントなり教えていただけると助かります。
できれば.net、もしくはPerlで処理できるのが望ましいです。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/08/06 23:05:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント35pt

パーサそのものを生成できる yacc が第一選択肢でしょう。Linux であれは普通に使えます。

Windows環境では kmyacc が便利でしょう。

id:memo77

なるほどー。参考になります。


……が、これを使いこなして正しくパースするには1週間ぐらいかかるか。

ガリガリ書いたほうが早いかもなあ。


今後のために勉強するかもですが、もし他に簡単そうなネタをご存知の方がいましたら引き続き回答募集中です!

2009/07/31 00:56:30
id:rryu No.2

回答回数30ベストアンサー獲得回数2

ポイント35pt

抽象構文木(AST:abstruct syntax tree)を構築して、それを使って処理をするということになると思います。

抽象構文木というのはノードが演算子やリテラル、変数名になるようなツリー状のデータ構造です。

ASTを生成する為には以下の手順が必要になります。


  1. BNF(Backus-Naur Form)で文法を定義する
  2. 文法定義に基づいて、テキストからトークンを切り出すレキサ(スキャナ、トークナイザとも言う)と、トークンの並びを解析してASTを構築するパーサを作る

ASTを生成して終わりってことはほとんど無いので、汎用的なものは無いようです。

通常はyaccなどの汎用のパーサジェネレータを使ってパーサを作ることになります。

ちなみにパーサジェネレータはレキサを生成してくれません。これは結構罠です。


.NETで使えるパーサジェネレータにはjoyというものがあるようです。

http://diary.lightnovels.net/mass/20030211.html#p06


PythonでよければSparkモジュールを使うのがGenericASTBuilderクラスがもあって色々楽そうです。

魅力的なPython: Sparkモジュールを使った構文解析

http://www.ibm.com/developerworks/jp/linux/library/l-spark/index...

id:memo77

いろいろ用語を書いていただいたので、調査が楽になりました。ありがとうございます。

クラスとしてすでに存在してプロパティをセットしていくことで構文解析できるほど汎用化するのは無理っぽいですね。

joyはすぐ使えそうなので、ヒマをみて触ってみることにします。

2009/08/05 10:40:26
  • id:memo77
    application "サンプル"
    {
      allow html = true
      date format = "yyyy/MM/dd"
      time zone = "Asia/Tokyo"
      section Section_info
      {
        displayname = "インフォメーション"
        form Information
        {
          displayname = "インフォメーション"
          store data in zc = false
          success message = "データが追加されました!"
          
          Description
          (
            type = plaintext
            value = "インフォメーション欄\n"
          )

          actions
          {
            on load
            {
              if (zoho.loginuserid == null)
              {
                for each record1 in InformationList [(Visible && FormName == "Information_nologin")]
                {
                  input.Description = record1.Description;
                }
              }
  • id:memo77
    おおむねクラス定義が{}で括られ、クラス変数がhoge=mogeの形で記述される。こちらには行末のセミコロンはない。
    内部クラスは同様に入れ子になっていく。
    メソッドがon xxx{}と定義され、メソッドの中は命令行の終わりがセミコロン。
    という感じです。
  • id:b-wind
    自分も yacc に1票かなぁ。
    基本的には構文解析器と言うジャンルにはなる。
    http://ja.wikipedia.org/wiki/%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90%E5%99%A8

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません