パーサーとか構文解析とかその他もろもろ
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/01/08(金) 23:32:50パーサー技術、実装、ちょっとした技、そのたいろいろ教えてください。
じゃ
0002デフォルトの名無しさん
2010/01/08(金) 23:34:10とりあえず
ANTLR,JavaCCとかを使い始めていますが、まったくもってイライラします
もっといいのないですか?
0003デフォルトの名無しさん
2010/01/08(金) 23:35:30L ⇒ R a | R b
R ⇒ (c | b)*
がコンフリクトするとかいわれてまじいらついてます
0004デフォルトの名無しさん
2010/01/08(金) 23:36:220005デフォルトの名無しさん
2010/01/08(金) 23:49:28マジ簡単だから
0006デフォルトの名無しさん
2010/01/09(土) 00:23:54noopがたぶんScalaで構文解析の部分書いていたと思う。
0007デフォルトの名無しさん
2010/01/09(土) 00:25:46で、だ、
Haskellってのおぼえないとつかえないんじゃないの?
それをおぼえるのと、Yaccおぼえるのと、どっちが簡単なのかがもんだい。
まあ、おぼえたあと、どっちがイラつかないかも問題だけど。
0008デフォルトの名無しさん
2010/01/09(土) 00:26:560009デフォルトの名無しさん
2010/01/09(土) 00:30:02たんに文字列受け取ってJavaプログラムで操作できるASTにできればいいだけ、
後はこっちで書くから、、ってかんじ
そういう用途むけのパーサーツールがあってもいいとおもうんですけどーー
0010デフォルトの名無しさん
2010/01/09(土) 00:31:140011デフォルトの名無しさん
2010/01/09(土) 01:06:09・Rは特殊文字"#1,#2,.."(SPEC)と文字列(STR)を要素として含む。
・r,r1,r2がRに含まれるならば、r1+r2, r1;r2, (r), (r)*, (r)? もRに含まれる
・文字列としての#,+,;,*,?を表現するためエスケープ文字"\"を導入
・例:"123dff" -> STR(123ddf)
: "\\ddf" -> STR(\ddf)
: "#134;dd" -> SPEC(134);STR(dd)
: "\#134dd" -> STR(#134dd)
: "\#134;dd" -> STR(#134);STR(134)
; (3+g)+\+ -> (STR(3)+STR(g))+STR(+)
; \(3+h;#5 -> STR((3)+STR(h);SPEC(5)
こういうのを作りたいんですが、あ、あくまでASTをとれればいいんですが、
こういうのちょいちょいっとつくれるのないんですかねー
0012デフォルトの名無しさん
2010/01/09(土) 01:15:040013デフォルトの名無しさん
2010/01/09(土) 01:26:13Shift-Reduceコンフリクトを取り除くが大変になるんだよ。そう、悟った俺は
トップダウン型のパーサーの方が楽って事に気づいた。で、現状のパーサーは
どれもLL(∞)で、トークンを何個も先読みできるし。だいたいの言語は何個も先読み
しなきゃいけない部分なんてそんなたくさんあるわけじゃないし、問題なし。
0014デフォルトの名無しさん
2010/01/09(土) 01:34:48こういう文法は(直観的なものから)書き換える必要があるけど、LL(k)で処理可能
結論としては、なれればLL(k)がいい。
0015デフォルトの名無しさん
2010/01/09(土) 02:16:420016デフォルトの名無しさん
2010/01/09(土) 02:33:14パーザや構文解析処理が必要になった場合、その実現方法には
yaccなどのコンパイラコンパイラを使う方法もあるが、他には
「再帰下降構文解析」という古典的なアルゴリズムがある。
・http://ja.wikipedia.org/wiki/再帰下降構文解析
このWikipediaの解説ではC言語が用いられているが、
Javaへの書き換えは容易なはず。もし>>1がこの記事を理解できて、
それに興味を持ったのなら、残念ながら既に絶版になっているが
以下の書籍を古本や図書館などで入手・閲覧でするのがお勧め。
・「翻訳系構成法序論」 ニコラス・ヴィルト著 近代科学社
策員を含めて133ページの薄っぺらな本だけど、PL/0と呼ばれる
小さな手続き型言語の処理系の再帰下降による作成方法が
詳細に解説されている。記述言語はModula-2というPascal系言語だが、
こちらもJavaへの書き換えは容易なはず。
0017デフォルトの名無しさん
2010/01/09(土) 02:57:46>>1が使い始めているjavacc,antlrがそもそも再帰下降構文解析を実装しているんじゃないの?
(バックアップ回数が制限されてるから正確には制限された再帰下降構文解析だけど)
0018デフォルトの名無しさん
2010/01/09(土) 03:06:210019デフォルトの名無しさん
2010/01/09(土) 03:25:37Boost::Spirit って、Flex を置換出来るモノじゃないの?
<HOGE>とか、YY_START、yy_push_state()、とかの代替となるような関数・手法が見つからなくて、
あと変態黒魔術に死にそうになったんで、素直に Flex 使ってるけど。
0020デフォルトの名無しさん
2010/01/09(土) 07:53:01http://pc12.2ch.net/test/read.cgi/tech/1258431145/l50
0021デフォルトの名無しさん
2010/01/09(土) 13:29:12http://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
0022デフォルトの名無しさん
2010/01/09(土) 13:38:14ここまでレス付いちゃうと即死では dat 落ちしないかな。
重複で削除依頼するか。
0023デフォルトの名無しさん
2010/01/09(土) 18:44:30spiritはやめたほうが良い。
理由は単純にビルドが重いから。
0024デフォルトの名無しさん
2010/01/11(月) 18:48:250025デフォルトの名無しさん
2010/01/11(月) 22:32:051.パーサジェネレータなり自分で書くなりして、コードを抽象構文木に変換する
2.その抽象構文木を処理したりバイトコードに変換する
という行程を踏めばいいのはわかった。
で、どこにも聞けないんで聞くんだが…
抽象構文木?AST?ってなに?データ型なの?
0026デフォルトの名無しさん
2010/01/12(火) 10:07:48とにかくコードを特定の言語で処理できる抽象構文木にさえできれば
後はその言語でその抽象構文木を操作するプログラムを書けばいいだけ
0027デフォルトの名無しさん
2010/01/13(水) 01:04:520028デフォルトの名無しさん
2010/01/13(水) 12:02:12LALR(1)とLL(k)って実用性としてはどう違うんだ
PerlとかC++はLALR(1)でパースできないと聞いたが
0029デフォルトの名無しさん
2010/01/13(水) 16:47:20抽象構文木をどう扱うかの話はスレ違いですので、>>20 のスレでやってください
0030デフォルトの名無しさん
2010/01/14(木) 08:15:100031デフォルトの名無しさん
2010/01/14(木) 12:58:44なんか、このページ
http://diaspar.jp/node/236
に手入力でASTを作成して処理ってコードがいくつかあるけれど、
これの見た目でLispみたいな、Scalaのとこだと
Add(Number(5), Sub(Number(7), Number(9)))
が抽象構文木ってことでいいんだろうか…
0032デフォルトの名無しさん
2010/01/14(木) 22:19:43でですよ、自分で勝手に決めた文法から、こういう抽象構文木をぱぱって作ってくれるパーサー
をあっという間に作ってくれるパーサージェネレーターがほしいんですよ。
yacc/lexとか、javaCCとかまじいらつくんで、もっといいのないんですか?
たんにASTと作りたいだけなのに、どんだけ頭つかわして、コードかかせてんだよ!ってかんじですねw
0033デフォルトの名無しさん
2010/01/15(金) 00:15:21だってLispは抽象構文木をそのままプログラミング言語に
したものだし
0034デフォルトの名無しさん
2010/01/15(金) 05:02:05関数型言語は、型名(クラス名)、コンストラクタ名、印字表現名が一致しているのが伝統的で、後者二つにはディホォールト実装がある。だからプロトタイプ実装に強い。
ただ、デバッガサポート、エラー処理やろうとすると、ディフォールト実装のままではどうにもならない。
0035デフォルトの名無しさん
2010/01/15(金) 08:32:14パターンマッチ最強だなw
0036デフォルトの名無しさん
2010/01/15(金) 16:14:17構文廻りはパターンマッチの連続だから、パターンマッチcaseだけじゃなくて、パターンマッチ渡しある方が簡潔になるね。
0037デフォルトの名無しさん
2010/01/16(土) 00:36:380038デフォルトの名無しさん
2010/01/16(土) 01:28:52つまりLisp最強ってこと?
Lispは今度出るClojure本待ちで勉強しようと思ってる。JVMならJavaから呼べるだろうし
感じとしてはコードを生成→コードを処理、って感じになるのかな
Antlrはもうちょっと日本語の資料があればなぁと思う
Javaのパーサ生成器はJparsec
ttp://jparsec.codehaus.org/
ってのを見つけてるけど日本語の資料が皆無(ブログで書いてくれてる人も旧バージョン)で
サンプルコードも計算機しかないし使いこなせる気がしない…
0039デフォルトの名無しさん
2010/01/16(土) 02:19:260040デフォルトの名無しさん
2010/01/16(土) 23:02:14ソースをくれませんか??
c言語でお願いします。
記事を辞書を使って解析するようなものがいいです。
0041デフォルトの名無しさん
2010/01/16(土) 23:44:060042デフォルトの名無しさん
2010/01/17(日) 13:56:59簡単なことだとプログラミング言語の作者とかが言ってるのを読んで
簡単なのだろうと思っていた。
それでググってみるといろいろ情報がある、楽勝だろうと思っていたが、
理解できない。
簡単なはずのことが出来ない自分に腹が立ち、理解できない現状に腹が立つ。
それで、ライブラリがあればと思ってyaccとか何とかをつかってみる。
すると今度はその使い方が難しい。
なぜかというと、そのライブラリが別パラダイムの別な言語だからと気がつく。
理想は例から構文解析ツールが出来るようなものなのだ。でも現実にはない。
xmlschemaの定義がGUIで出来るものがあるように、
GUIで組み立てられるツールがあればいいのかもしれないけどない。
というか、xmlschemaが難しい。難しいけど認めたくない。
感覚的に理解しやすいのはおそらく、再帰下降法だ。
四則演算なら理解できた。
ただ、Javaで思った文法を直書きすると永遠と長く書かないといけないことに気がつく。
めんどくさい。
パーサジェネレータは難しい。直書きはめんどくさい。
関数型言語とやらがよいらしい。
ocamlを勉強する。結局構文解析はyaccをつかうことになる。
haskellを勉強する。parsecとやらがいいらしい。
パーサコンビネータとかなんかが、結局yaccとかといっしょだ。わけわからん。
0043デフォルトの名無しさん
2010/01/17(日) 14:00:40だから、理解するしかないと思え。
0044デフォルトの名無しさん
2010/01/17(日) 14:17:39例によって、計算機作ることから始めたけど、普通にCとか使える奴なら、するする進めると思うけど。
0045デフォルトの名無しさん
2010/01/17(日) 14:18:490046デフォルトの名無しさん
2010/01/17(日) 14:24:50俺、フル仕様のC++の構文解析なんか、変態過ぎて見たくもないし作りたくもないぞ。
0047デフォルトの名無しさん
2010/01/17(日) 14:26:000048デフォルトの名無しさん
2010/01/17(日) 18:31:58一番ひどいのは、COBOLらいしけど。
0049デフォルトの名無しさん
2010/01/17(日) 20:04:53薄いのでいいからコンパイラの本を読め
うまく立ち回れば楽ができると考えるのは図々しすぎる
0050デフォルトの名無しさん
2010/01/17(日) 23:21:580051デフォルトの名無しさん
2010/01/18(月) 10:40:01とくにまともなソフトに組み込む場合
0052デフォルトの名無しさん
2010/01/18(月) 10:55:300053デフォルトの名無しさん
2010/01/19(火) 00:19:23ま、それを突き詰めればツールなのだろうが
0054デフォルトの名無しさん
2010/01/19(火) 02:49:260055デフォルトの名無しさん
2010/01/19(火) 05:54:02自作するとなると相当難しいよね
0056デフォルトの名無しさん
2010/01/19(火) 06:31:29javaCCにも入ってるし、そもそもjavacがオープンソース。
0057デフォルトの名無しさん
2010/02/02(火) 21:46:49ボトムアップでパーサコンビネータっぽいのってなんかないの?
0058デフォルトの名無しさん
2010/02/07(日) 15:36:510059デフォルトの名無しさん
2010/02/07(日) 20:56:48言語本体との親和性という意味ではRubyのraccが、使いやすいyaccという感じだった。
HaskellのParsecは、構文解析はすごくわかりやすく書けるけど、字句解析がなんか微妙。
ドキュメントやサンプルが少なくて理解できてないだけかもしれんが。
ParsecとかBNFCとか見てると、今後は構文解析の定義を自分で一から書くんじゃなくて、
ライブラリが提供するテンプレート(JavaタイプとかHaskellタイプとか)をカスタマイズする
方向に発展していくのかなとも思う。
0060デフォルトの名無しさん
2010/02/08(月) 01:23:57字句解析まで手書きしたものか悩んでる。
字句解析は構文解析ほど複雑じゃないから、手書きも可能そうだけど、
手持ちのlexは使えるから、それで十分っぽい気もする。
もし字句解析を手書きした人がいたら、
どういうメリットから手書きを選んだのか参考に教えて欲しいな。
0061デフォルトの名無しさん
2010/02/08(月) 10:38:540062デフォルトの名無しさん
2010/02/08(月) 18:24:10もし手書きするのが再帰下降のトップダウンパーサなら
構文解析と字句解析はほぼ同時に行うから
字句解析処理だけ専用に作ったりはしなくない?
0063デフォルトの名無しさん
2010/02/08(月) 18:34:190064デフォルトの名無しさん
2010/02/08(月) 22:27:13AAAがクラス名であるか否かを判断するのって、
結局前に来てるトークンがclassだとか、
”{”がすぐ後ろに来るとか、Extendsがくっついてるとか、
そういう情報から特定してるんでしょうか?
何かもっと効率的に判断するための方法があるんでしょうか。
0065デフォルトの名無しさん
2010/02/09(火) 01:39:12よくわからないけど。Javaの文法ってそんなかんじじゃなかったっけ?
0066デフォルトの名無しさん
2010/02/09(火) 01:52:11トークン列がクラス定義(class 名前 ...)だったり
インスタンス生成(new 名前...)だったり
例外送出(throw 名前...)というのを判別するのが先。
その後でマッチした名前がクラス名の役割のものだと分かる。
0067デフォルトの名無しさん
2010/02/09(火) 02:13:24関数になると少し取りにくくなって
変数になるとさらに取りにくいよな
0068デフォルトの名無しさん
2010/02/09(火) 02:27:25・宣言されたクラスの型
の後ろに来るidentiferが変数名かな?
ぱっと考えただけだから例外あると思うが。
006960
2010/02/09(火) 08:28:22>>61 同意せざるをえない。今回はクラスに押し込める予定。
>>62 そんな高尚なブツは作れないです。
キーワードの前後関係から文を解釈する原始的なものなので。
>>63 確かに。lexのスタート状態で何とかなるかな、程度に考えてる。
0070デフォルトの名無しさん
2010/02/19(金) 18:01:130071デフォルトの名無しさん
2010/02/24(水) 22:14:370072デフォルトの名無しさん
2010/02/26(金) 01:42:34関数呼び出しなのかラベルなのか変数なのか最後までわかんないな
0073デフォルトの名無しさん
2010/03/11(木) 11:54:15char str[]= "hoge \
fuga\
bar";
みたいに\で区切る言語があるけど
\なんか打たなくても
最近の進歩した解析法で、これは自動認識するようになってたりしないの?
0074デフォルトの名無しさん
2010/03/11(木) 11:56:110075デフォルトの名無しさん
2010/03/11(木) 15:35:010076デフォルトの名無しさん
2010/03/11(木) 19:13:310077デフォルトの名無しさん
2010/05/02(日) 09:08:32ここをBNFサンドボックスにしていい?
駄目なら他に行きます。
""";
0078デフォルトの名無しさん
2010/08/31(火) 15:04:090079デフォルトの名無しさん
2010/08/31(火) 15:13:46「コンパイラ」なら普通「ドラゴンブック」と呼ぶ。
0080デフォルトの名無しさん
2010/08/31(火) 16:17:240081デフォルトの名無しさん
2010/08/31(火) 17:51:00メール書くか電話してみ?
0082デフォルトの名無しさん
2010/09/02(木) 12:11:230083デフォルトの名無しさん
2010/09/08(水) 16:40:20文字セットが7-bit character set (ISO/IEC 646:1991 International Reference Version)
なんという時代遅れ
この辺のメタ構文言語ってそれぞれが勝手に微妙に変えて作るし
W3Cしかり、GOのページにも別種が載ってるし、
RFCはABNFだっけ。最近はPEGもあるし
PEG以外で一個覚えるとしたらどれがいいんだ
0084デフォルトの名無しさん
2010/09/10(金) 10:01:380085デフォルトの名無しさん
2010/09/10(金) 17:58:12とりあえずEBNF自身をパース出来るEBNFパーサを作ったけど
文字はすべて1文字ずつ|で区切って記述。
これでUnicode文字を表現するのは悪夢
??で独自拡張するのも微妙だし
Unicodeぐらいは組み込みで使えるやつはないのだろうか
今度はABNFについて調べる作業がはじまるお
0086デフォルトの名無しさん
2010/09/11(土) 16:10:100087デフォルトの名無しさん
2010/10/07(木) 13:29:44どんなデータ構造にしたらいいですか?
0088デフォルトの名無しさん
2010/10/07(木) 16:39:190089デフォルトの名無しさん
2010/10/09(土) 15:29:40ユニコードの実質使う文字数が1万個くらいかなーとおもっただけで
正確には100個くらいかもしれません。
0090デフォルトの名無しさん
2010/10/09(土) 15:31:200091デフォルトの名無しさん
2010/10/09(土) 15:32:490092デフォルトの名無しさん
2010/10/10(日) 01:39:31100万bitの配列をもつのはいかにも非効率だから、
Unicodeコードポイントのレンジを表現できるデータ構造をつくって
intersectionやunionの演算をできるようにしておくのかねえ
0093デフォルトの名無しさん
2010/10/20(水) 15:15:490094デフォルトの名無しさん
2010/11/12(金) 07:12:540095デフォルトの名無しさん
2010/11/12(金) 07:31:530096デフォルトの名無しさん
2010/11/12(金) 07:56:59, ‐' ´ ``‐、 / ̄:三}
. /,. -─‐- 、. ヽ / ,.=j
_,.:_'______ヽ、 .! ./ _,ノ
`‐、{ へ '゙⌒ `!~ヽ. ! /{. /
`! し゚ ( ゚j `v‐冫 , '::::::::ヽ、/ そんなことよりyaccしようぜ!
. {.l '⌒ ゙ 6',! / :::::::::::::::/ __
. 〈 < ´ ̄,フ .ノー'_ , ‐'´::::::::::::::;/ (_ノ)‐-、
. ヽ.、 ` ‐", ‐´‐:ラ ':::::::::::::::: ;∠. ヽ_} ゙ヽ
,.r` "´ /:::::::::::::::::::ィ´ `ゝ !、 /
/ / :::::::::::::::: ; '´ /´\ / r'\
. i ! ::::::::::::::/ 墨 | .!::::::::/ヽ、.._!ヽ. ヽ、
{ {:::::::::::;:イ / ‖i:::::::/:::::::::::::/ \
. ヽ ヽ,.ァ‐'´ /ヽ 二 ,/`ヽ、::::::::: /
0097デフォルトの名無しさん
2010/11/12(金) 10:18:34ttp://www.amazon.co.jp/dp/4797337958/
0098デフォルトの名無しさん
2010/12/06(月) 00:11:250099デフォルトの名無しさん
2010/12/26(日) 00:43:17Aのパース結果の型をどうするかって時
A = *( B | C )
オブジェクト指向だとBとCの共通の基底クラスを作って
その配列を結果とする、よりも良い解ってありますかね
0100デフォルトの名無しさん
2011/01/15(土) 18:02:36PEGパーサでパースする際にパースされないパスを教えてくれるようなツールってないかな
["+"] / "-" って文法はPEGのパーサだと"-"にマッチしないから
0101デフォルトの名無しさん
2011/01/17(月) 02:56:26Dominance frontier で分からないことがあるんだが。
0102デフォルトの名無しさん
2011/01/17(月) 10:22:21http://hibari.2ch.net/test/read.cgi/tech/1258431145/
こちらへどうぞ
0103デフォルトの名無しさん
2011/01/18(火) 00:39:56ありがとう
0104デフォルトの名無しさん
2011/03/02(水) 22:27:34.730105ななし。
2011/07/27(水) 22:22:51.160106デフォルトの名無しさん
2011/08/19(金) 11:16:18.800107デフォルトの名無しさん
2011/09/02(金) 10:04:15.660108デフォルトの名無しさん
2011/09/26(月) 02:03:53.010109デフォルトの名無しさん
2012/05/01(火) 07:27:16.340110デフォルトの名無しさん
2012/05/01(火) 07:28:56.56■ このスレッドは過去ログ倉庫に格納されています