• ベストアンサー

パーサーに関する良本

計算式の文字列を外部から渡し、計算結果を返すプログラムを作ろうとしています。 色々調べた結果、パーサーという物があることが分かったのですが、 使い方が分りません。 日本語での良い本(サイト)があれば、教えてください。

  • tk332
  • お礼率93% (59/63)

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★アドバイス ・過去に似たような質問が別カテゴリでありました。参考に。  http://oshiete1.goo.ne.jp/qa3495084.html→『数式から不要なカッコを取り除く方法』  LL法について  http://ja.wikipedia.org/wiki/LL%E6%B3%95→『LL法』  構文解析について  (a)http://ja.wikipedia.org/wiki/%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90→『構文解析』  (b)http://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0%E4%B8%8B%E9%99%8D%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90→『再帰下降構文解析』  (b)にはソースが載っています。 ・最初は『再帰的な式評価』が簡単だと思います。  下に紹介する『C言語による実用アルゴリズム入門』もお勧めです。  基本的にアルゴリズムの本ですが、ここに式評価や簡単な多倍長演算のソースなどが  載っています。電卓プログラムで参考になる1冊です。ぜひ。どうぞ。 本の紹介:  (1)http://www.amazon.co.jp/dp/4797328290/→『C言語による実用アルゴリズム入門』  この本の『Chapter7 式の処理』で   7.1 トークン解析   7.2 逆ポーランド記法を使う式の解析   7.3 逆ポーランド記法の式評価   7.4 再帰的な方法による式の解析   7.5 電卓のプログラム   となっています。  (2)http://www.amazon.co.jp/dp/4839919232/→『いまどきのプログラム言語の作り方』  こちらは本格的な書籍です。 ・以上。参考に。

参考URL:
http://www.amazon.co.jp/dp/4797328290/
tk332
質問者

お礼

回答ありがとうございます。 資料を参考に勉強してみます。

その他の回答 (3)

回答No.4

下記の本をお勧めします。 ソースコードがついています。 Modula2ですが C++へのが変更可能です。 マイクロコンピュータのための 「コンパイラ・コンパイラ」 ~ コンパイラ自動生成にむけて ~ P.レッヒェンベルク H.メッセンベック 著 玉井 浩(大妻女子大学教授) 訳 定価:3,990円(本体3,800円+税) 発行:サイエンス社 発行日:1991-02-01 ISBN 978-4-7819-0607-2 / A5判/432頁

tk332
質問者

お礼

回答ありがとうございます。 本屋に行って見てみます。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

本格的なパーサは、コンパイラやインタプリタなどの言語を作る時に使うのが普通ですね。関数も無いような簡単な計算式でしたら自力で構文解析プログラムを作ったほうが早いですよ。 こんなのとか↓ http://ruffnex.oc.to/kenji/src/dentaku2.c たしかにパーサで電卓を作っている例も結構ありますので、挑戦してみるのも良いかもしれません。 yacc/lexというプログラムを使います。 http://kmaebashi.com/programmer/devlang/yacclex.html こちらの方が覚えることは多いです。 どちらが良いかは、どこまでの機能を作るかで決まります。

tk332
質問者

お礼

回答ありがとうございます。 パーサのことを知らなかったので自分で作ろうとしたのですが、 途中で挫折し、色々調べているうちに、パーサにたどり着きました。 if, exp, log, max, min やいくつかのオリジナルの関数などを入れたいと考えています。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

パーサとは構文解析器のことをいい、 CやC++、Java、XMLなどさまざまな種類あります。 言語仕様にも絡んでくると思います。 計算式というのはどのような仕様なのでしょうか? とりあえず、どういうものか。 http://ysserve.int-univ.com/sugsi/Lecture/syntcomp/section2.html

tk332
質問者

お礼

早速の回答ありがとうございます。

関連するQ&A

  • BCBで使えるHTMLパーサー、リンクの抽出

    Borland C++Builderで使えるHTMLパーサーのVCLを探しています。海外では、THTMLParserなどを検索語にして調べると幾つかありましたが日本語が文字化けしたりして、調子よくありません。 http://www.dallas.net/~richardp/delphi/components/home.html 日本語の通るフリーのHTMLパーサーのVCLというのはご存知でしょうか。 また、実際にやりたいのは、ページから、 ・<TITLE>タグで囲まれたタイトルの抽出 ・<A HREF = URL>リンク文字列</A>  の、URL部分とリンク文字列のリストを得る ということなのですが、私の拙い知識では何度やってもうまく取り出すことができません。それでVCLでできないかなあと調子の良いことを考えています。こういった文字列解析の定石のようなコーディングはあるのでしょうか。 質問ばかりですみません。ご存知の方よろしくお願いいたします。

  • 純Perl製のXMLパーサーはありませんか

    horagaiです。お世話になっております。 PerlでXMLファイルを処理する必要があり、Perlで使えるXMLパーサーを探してみたところ、XMLParserというそのものずばりの名前のモジュールがあることがわかりました。 しかし、これはXMLパーサー本体ではなく、expatというC言語で書かれたXMLパーサーを利用するためのインターフェイスらしいです。それに私は無料ホームページスペースで使いたいので、コンパイルの必要なモジュールは利用できません。 Perlだけで使える(expatのようなPerl以外で書かれた非標準的外部プログラムを必要としない)XML処理用のライブラリー(モジュールではなくパッケージ)をご存知ないでしょうか。 出来れば日本語も処理できる(それもUnicodeだけでなくEUC-JPやShift-JISのファイルも)ようなものが望ましいです。 Perlはテキスト処理が得意なので、Perlで書かれたXMLパーサーは当然あると思っていたのですがどうも見つかりません。 なお利用目的としてはデータ構造を取り出すと言うよりも単にXMLデータをHTMLに直したいだけなので、別にXMLパーサーでなくてもそのような目的に使えるようなパッケージであればそれでも構いません。 なおCPANも一応はチェックして見ましたが見つかりませんでした。(もちろん見落としはあるかも知れませんが) よろしくお願いします。

    • 締切済み
    • XML
  • RubyのHTMLパーサーで複数のタグを抽出したい

    現在、Rubyを用いて あるWebページから特定のタグの要素を抽出して テキストデータに出力したいと思い、プログラムを書いているのですが、 途中で行き詰ってしまいました。 ちなみにHpricotやNokogiriといったHTMLパーサーを試してみました。 パーサーを使うのは初めてです。 例えば以下のようにHTML文書に抽出したい部分がDIVタグとPタグに囲まれていた場合、 ===================================== ・・・ <div class="content"> <div class="header">不要部分</div> <div class="title">抽出したい文字列1</div> <div class="subtitle">抽出したい文字列2</div> <div class="subtitle">抽出したい文字列3</div> <p class="paragraph">抽出したい文字列4</p> <p class="paragraph">抽出したい文字列5</p> <div class="comment">抽出したい文字列6</div> <div class="footer">不要部分</div> </div> ・・・ ===================================== このHTMLからまずは 抽出したい文字列1 抽出したい文字列2 抽出したい文字列3 抽出したい文字列4 抽出したい文字列5 抽出したい文字列6 といった出力が得たいのです。 プログラムも書いてみました。 ===================================== #ドキュメント全体を取得(dataにはHTMLの文字列が入っている) html = Hpricot(data) #内容部分(contentクラスのdiv)を取得(CSSセレクタで記述) content = html/"div.content" ===================================== ここまでは良いのですが、 そのあと、div要素を取り出すだけであれば headerクラスと、footerクラスを抽出しないように ===================================== (content/"div:not(.header):not(.footer)").each{ |line| puts line.inner_html } ===================================== とすることで、 抽出したい文字列1 抽出したい文字列2 抽出したい文字列3 抽出したい文字列6 が得られますが、pタグをカンマでdivの前に追加して ===================================== (content/"p,div:not(.header):not(.footer)").each{ |line| puts line.inner_html } ===================================== のようにすると、 抽出したい文字列4 抽出したい文字列5 抽出したい文字列1 抽出したい文字列2 抽出したい文字列3 抽出したい文字列6 のように出力されます。 同様にdivの後にpを追加し ===================================== (content/"div:not(.header):not(.footer),p").each{ |line| puts line.inner_text } ===================================== のようにすると 抽出したい文字列1 抽出したい文字列2 抽出したい文字列3 抽出したい文字列6 抽出したい文字列4 抽出したい文字列5 のようになってしまいます。 つまり、複数のタグを指定すると、指定した順序で抽出されるようです。 代わりに子供すべてを列挙するchildのようなものがあるかと、調べてみたのですが、 どうやらそのような書き方はないようです。 複数のタグを含む場合にはHTMLパーサーでは解析できないのでしょうか。 パーサーは抽出時に順番を保証はしてくれないのでしょうか。 あきらめて、正規表現で抽出しようと思いましたが、 ===================================== <div class="comment"> <div class="comment_header">ごちゃごちゃ</div> <div class="comment_body">抽出したい要素6</div> </div> ===================================== などDIVが入れ子となっている場合に、 非常にややこしく感じたので お手上げ状態です。 どのように、解決できるでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Ruby
  • 日英対応のメニューの作り方

    CでWindowsのプログラム作っています。 メニューの文字が現在、日本語で表示するようにプログラムしていますが、英語表示版が必要になりました。リソースファイルを書き換えて再コンパイルすれば英語版ができるのはわかりますが、もっとスマートな解決策ありませんか? たとえば、外部ファイルとして日本語、英語メニュー文字列を用意しておいて、起動時にどちらかを読み込んで、そこの文字列を表示するとか、日本語版、英語版のメニューをあらかじめプログラムに埋め込んでおいて、実行時のオプションメニューなどで表示を切り替えるなどです。 具体的なテクニックとそのためのコーディングお教えください。 なお、リソース・エディタは、「BCCForm and BCCSkelton」を使っています。

  • apacheの動作について

    こんばんは。 変数の計算結果をブラウザに出力するというcgiを書きました。しかし、ダブルクォーテーションでくくった変数($number1,$number2,$answerという変数です)は、表示されるのですが日本語の部分が文字化けします。 しかし、日本語だけを表示するcgiプログラムを書いてみると、こちらはきちんと表示できました。 その後、最初の計算プログラムを表示してみたら、すべて上手く表示できました。 これは、どういうことなのでしょうか?Apacheがおかしいのですか? だれか、原因の分かる方は教えてください。よろしくお願いします。

    • ベストアンサー
    • Perl
  • アクセスDBファイルの複数テーブルの文字列を簡単に置換するには?

    アクセスのデータベースファイル内30テーブルほどの データがあります。 そのデータ内にあるひとつの文字(例えばABC)という 文字列があり,それを別の文字列(例:1000)に一括して 置き換えたいのですが,今のところ,一つ一つテーブルを 開いて置換コマンドを使って文字列を入力しています。 しかし、データベース内にあるABCと言う変数は計算に 使用するためその都度変更する必要があるため、とても面倒に感じています。 アクセスだけでこの作業はできるのでしょうか。 もし、できなければ外部プログラムでなにか良いものが あるでしょうか。ご教授ください。 よろしくお願いします。

  • 外部ファイルの数値を合計計算する方法

    外部ファイル(ここではCSVファイル)内の列ごとの数値を合計し、結果をコマンドに表示したいです。 数値を合計するためsum関数を用いることは分かったのですが、各列ごとの出力・数値の合計はどのようにすればいいのですか。 合計計算のイメージはこんな感じです。 CSVファイル内 1 , 25 2 , 50 3 , 75  ・  ・  ・ プログラムで外部ファイルを読み込み、各列ごとの和を計算し、 Σx=1+2+3+・・・ Σy=25+50+75+・・・ コマンド(Cygwinを使用しています)上で、 x = (数値) , y = (数値) と表示することです。

    • ベストアンサー
    • Perl
  • ソースプログラムでの日本語使用について

    Windows10のパワーシェルでソースプログラムをコンパイルしていますが、そのソースプログラムの出力部で日本語を用いると文字化けてしまいます。出力部とは、C言語だったらprintf, Fortranだったらwrite文です。ここで文字化けを解消するにはどうしたらいいのでしょうか。 パワーシェルは日本語ファイル、フォルダに対応しており、ファイル名が日本語でも問題ないようです。また、ソース内のコメントは日本語でもOKです。ただ、ソースプログラムを実行するとその結果の出力が文字化けてしまうのですが。コンパイラオプションでしょうか。 Rubyはコメントでさえも日本語がUTF8でないとダメとか、いろいろ事情がありそうです。 あるC言語の解説本は冒頭部から思いっきり日本語出力となっており、それが対応できないのです。 使用しているコンパイラはGNU系のもので、gccなどです。よろしくお願いします。

  • 文字列

    C言語初心者です。プログラムについて質問なのですが、テキストファイルからある文字列(アルファベットではなく日本語)を探すにはどのようにすればいいのですか?

  • エクセルで、セルの中の日付に日本語などの文字列がついてる時でも、数字(?)として認識させる方法はありますでしょうか?

    エクセル97で、 セルの中に日付が入ってたとして その日付に余分に日本語などの文字列がついてる時、 (例えば「7/7予定」のように) 数字として認識されないため(?)、 「ある日付からある日付を引いて、残り何日 残ってる・・・」というように日付が計算の対象に なりません。 日付に日本語などの文字列などを付け加えても、 日付を数字として認識させる方法はありますでしょうか? もう少し補足しますと、 その日付を違うシートに「リンク貼り付け」 したいため、リンク先のある日付と、リンク元の (日本語付き)の日付とを計算できないかと悩んでいました・・・

専門家に質問してみよう