Wikiの記法やはてな記法のような独自記法を字句解析/構文解析を利用して実装したいと思っていますが、字句解析/構文解析についてよく分かってないので、それらについて参考になるサイト、または書籍等を教えてください。


また、実際に字句解析/構文解析を利用して実装されたテキストパーサ等があったら教えてください。

あと使用できる言語はPerlとJavascriptで、独自記法のパーサはPerlで実装しようと思ってます。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/02/24 09:43:34
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:dev_zer0 No.3

回答回数332ベストアンサー獲得回数25

ポイント35pt

簡単に言うと

字句解析:文字列をトークン単位に区切ること

構文解析:区切られたトークンの並びからその文法を解釈すること

昔は字句解析はlex、構文解析はyaccで行っていました

http://www.amazon.co.jp/lex-yacc%E3%83%97%E3%83%AD%E3%82%B0%E3%8...


実際に字句解析/構文解析を利用して実装されたテキストパーサは多分ほとんどのプログラムで行われているはずです

全てのコンパイラ、スクリプト、SQL、XML、HTML、LaTeX

ちょっと考えただけでこれだけあります。


ちなみにperlでの構文解析器です

http://www-06.ibm.com/jp/developerworks/linux/000728/j_perl-pars...


ま、単純なものであれば

if ($文字列 =~ /パターン/) {

  なんか処理

}

を連ねていけばいいと思いますが、エスケープ処理やコメントがあったりするととたんに面倒になります

id:nyarla-net

> ちなみにperlでの構文解析器です

のリンク先で紹介されているParse::RecDescentは使ったことがあるんですが、なかなかうまくいかなかったです。

字句解析/構文解析の概念は分かってきたのですが、具体的にどうやっていけばいいかがよく分からないんですよね。

なんか良い書物は無いでしょうか?

2007/02/23 13:38:18

その他の回答4件)

id:sadajo No.1

回答回数4919ベストアンサー獲得回数49

id:nyarla-net

紹介されたWikipediaのページ見てみましたが字句解析/構文解析のさわりだけで、踏み込んだ内容までは無かったですね。

2007/02/23 11:03:54
id:iwadon No.2

回答回数60ベストアンサー獲得回数13

ポイント30pt

C言語で字句解析・構文解析を行う際に使われるツールにyaccとlexがあります。それらに関する書籍やウェブページが参考になるかもしれません。

  • google:yacc lex
  • google:bison flex ... bisonはyaccに、flexはlexに、それぞれ互換性のあるツールで、こちらも良く使われています。

また、id:jkondoさんのText::Hatenaがまさにはてな記法の構文解析を行い、その結果を元にHTMLを生成しており、かつPerlで記述されていますので、参考になると思います。

id:nyarla-net

やっぱり字句解析/構文解析するとなるとlex/yaccあたりについて調べることになるんですね。

あとText::Hatenaはソース読んだ事はあるんですが、字句解析はやってなくて、テキストを一行ずつ読んで処理する、という感じでした。

2007/02/23 11:02:13
id:dev_zer0 No.3

回答回数332ベストアンサー獲得回数25ここでベストアンサー

ポイント35pt

簡単に言うと

字句解析:文字列をトークン単位に区切ること

構文解析:区切られたトークンの並びからその文法を解釈すること

昔は字句解析はlex、構文解析はyaccで行っていました

http://www.amazon.co.jp/lex-yacc%E3%83%97%E3%83%AD%E3%82%B0%E3%8...


実際に字句解析/構文解析を利用して実装されたテキストパーサは多分ほとんどのプログラムで行われているはずです

全てのコンパイラ、スクリプト、SQL、XML、HTML、LaTeX

ちょっと考えただけでこれだけあります。


ちなみにperlでの構文解析器です

http://www-06.ibm.com/jp/developerworks/linux/000728/j_perl-pars...


ま、単純なものであれば

if ($文字列 =~ /パターン/) {

  なんか処理

}

を連ねていけばいいと思いますが、エスケープ処理やコメントがあったりするととたんに面倒になります

id:nyarla-net

> ちなみにperlでの構文解析器です

のリンク先で紹介されているParse::RecDescentは使ったことがあるんですが、なかなかうまくいかなかったです。

字句解析/構文解析の概念は分かってきたのですが、具体的にどうやっていけばいいかがよく分からないんですよね。

なんか良い書物は無いでしょうか?

2007/02/23 13:38:18
id:Bookmarker No.4

回答回数191ベストアンサー獲得回数34

ポイント15pt

字句解析/構文解析の概念は分かってきたのですが、具体的にどうやっていけばいいかがよく分からないんですよね。

なんか良い書物は無いでしょうか?

dev_zer0さんが紹介されている書籍に詳しく書かれているのですが、今では手に入り難いようですので(私は捨ててしまった(^^;)、「Amazon.co.jp: Rubyを256倍使うための本 無道編: 本: 青木 峰郎」はいかがでしょうか?

Raccの解説書ですが、構文解析についてわかり易く書かれているので参考になると思います。

id:nyarla-net

参考にしてみます。

2007/02/23 13:33:21
id:Bookmarker No.5

回答回数191ベストアンサー獲得回数34

ポイント15pt

実際に字句解析/構文解析を利用して実装されたテキストパーサ等があったら教えてください。

PerlでもJavascriptでもなくRuby(Racc)での実装ですが、簡単なのを一つ。

RD working draft 日本語版
http://raa.ruby-lang.org/gonzui/markup/rdtool/doc/rd-draft.rd.ja
ソース
http://raa.ruby-lang.org/gonzui/markup/rdtool/lib/rd/rdblockpars...
id:nyarla-net

おお、色々見てみます。

2007/02/24 09:32:43
  • id:quintia
    字句解析/構文解析の勉強したいというのが目的なら判るのですが、「本格的な字句解析/構文解析を必要とするようなコンテンツ記述構文」をわざわざ作るというのは、目的に対して手段がミスマッチなんじゃないでしょうか。
    だからその様な実例はそう簡単には出てこないのでは?
    字句解析/構文解析が必要になるような構文にわざわざデザインする必然は、どこにもないですから。

    Wiki記法なんかはそもそも、複雑な構文解析や解りづらい正規表現が不要な様にデザインされていると思いますし、だからこそクローンがたくさん作られたわけですよね。WikiNameあたりの仕様に顕著ですけど。
  • id:nyarla-net
    字句解析/構文解析の勉強をして、スクリプト言語作ってみたい、と言うもあるんですが、記法のパーサを汎用化して出力を自由に変更したい、と言うのもあります。

    そのためにはNode Treeを構築する必要がありそうで、そのためには字句解析/構文解析が必要になりそうと思い、上記の質問をしました。

    まあ本格的な字句解析/構文解析を使ったテキストパーサ作ったらすげーものができるんじゃない、みたいなのもあるのですが。

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

トラックバック

  • HILOG on Hatena - リンク 2007-12-03 22:54:09
    リンク いろいろ忙しいので、参考になったWebサイトなど。 ローカル データの概要 正規表現を使って部分文字列を取得するには?[C#、VB] C# の正規表現クラスと Group クラス C# Regexクラス
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

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

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