「入れる」は状態スタックにプッシュするってことね。多くのLR構文解析系はスタックを使って状態記号を保存するので。
LR構文解析は状態記号が入ったスタックのトップの状態と入力記号列の最初の終端記号からだけで次に行うべき動作を決定する。
その動作が移動なら入力から一つ記号を取り出し構文解析表から次に移る状態を引いて状態スタックにプッシュする。
還元なら生成規則に従って状態スタックから特定の数だけ状態をポップして、
その時の状態スタックのトップの状態と還元された非終端文字で決まる状態をプッシュする。
この時にだけ還元された記号が使われるが後から使ったりしないので特に保存する必要はない。
953 :
デフォルトの名無しさん:2009/01/14(水) 18:07:01
>>952 だとするととてもありがたいのですが、それほんとに信じてもいいんですよね?
LR構文解析機を作ったことがあったうえで言ってるんですよね?
955 :
デフォルトの名無しさん:2009/01/14(水) 18:21:41
ちょっと読み返すと失礼にあたる書き方に見えてきました。
どうもすいません。
>>953をちょっと補足します。
コンパイラIの286ページ図4.39を参考にします。
ここでI0からI1へ遷移するためには非終端記号Sの入力が必要なのではないか?
と考えたわけです。
逆に終端記号のみから次の遷移先を決定できる項集合について考えると、
循環する文法記号がある場合、永遠に展開し続けねばならず、終端記号のみからなる
gotoグラフの作成は不可能ではないかと考えたのです。
これを可能にするには、goto表の入力となる非終端記号を何に置き換えればいいのでしょう?
よろしくお願いします。
相談に来ておいて相手に文句たれる奴っているよね。
なんで相談する気になったのかいつ見ても不思議
957 :
デフォルトの名無しさん:2009/01/14(水) 18:23:05
>>954さんも
>>952さんの考えを裏付けるってことですか?
私はドラゴンブックを見て考えていたので、最近の事情は知らないのです。
よろしくお願いします。
>>957 裏づけがほしいんだったら、相応の対価を払って専門家に会って聞くべき
構文解析系が入力記号列と状態スタックから構成されている場合、
状態スタックには最初に初期状態0がプッシュされている。
構文解析動作は、入力記号列の先頭の記号と状態スタックのトップ状態を見て、
対応する状態遷移表の項目からその動作を決定する。
移動なら、入力記号列の先頭記号を消費し、指定の状態を状態スタックにプッシュ。
還元なら、指定の生成規則の右辺の記号数だけ状態スタックからポップし、
その時の状態スタックのトップ状態と生成規則の左辺とで決まる状態をプッシュ。
受理なら、正しく構文解析が完了。それ以外はエラー。
構文解析系はこれだけで動作する。還元された非終端記号はそれ以降の動作に出てくることはない。
例えば、数と+を終端記号、式を非終端記号として、
(1) 式 ::= 式 + 数
(2) 式 ::= 数
のような生成規則に対して、+は左結合的とすると、
状態0:入力記号が数なら移動し状態1、還元されたものが式なら状態2
状態1:有無を言わせず生成規則(2)によって還元する
状態2:入力記号が+なら移動し状態3、入力が終端に達していたら受理
状態3:入力記号が数なら移動し状態4
状態4:有無を言わせず生成規則(1)によって還元する
のような状態遷移表が作られる。
状態スタック:0|入力記号列:数+数+数 (0と数で状態1移動)
0,1|+数+数 (1と+で生成規則(2)による還元、状態を1個ポップし0と式なので状態2をプッシュ)
0,2|+数+数 (2と+で状態3移動)
0,2,3|数+数 (3と数で状態4移動)
0,2,3,4|+数 (4と+で生成規則(1)による還元、状態を3個ポップし0と式なので状態2をプッシュ)
0,2|+数 (2と+で状態3移動)
0,2,3|数 (3と数で状態4移動)
0,2,3,4| (4と終端で生成規則(1)による還元)
0,2| (2と終端で受理)
で、受理される。
960 :
デフォルトの名無しさん:2009/01/14(水) 19:11:39
>>959 どうもありがとうございます。
よくわかりました。
お礼に私に出来ることはありますか?
>>955 「コンパイラIの286ページ図4.39を参考に」できないからその内容はよく分からないけれど、
LR項の集合族間の状態遷移図とLR構文解析系の状態遷移表による動作とは別物。
LR構文解析系の状態遷移表を構成するための理論的裏づけがLR項の集合族間の状態遷移というだけであって、
実際に構文解析を行うに当たって非終端記号を入力記号として記録する必要はない。
もちろん、次の状態を決定するために、ある1動作の範囲内で非終端記号は必要になるが、それだけ。
そして、その必要な非終端記号は還元時に定まるもので入力として記憶するものではない。
>>960 別にないよw
構文解析関係は理論だけでは取り付き難いから、
小さな系でもいいから実際に動作を手で追いかけながら見ていくと理解が進む。
LISPやれば構文とかどうでもよくなる
推敲せずに書いたらちょっと不要なことまで書いてしまった。
>>959の「+は左結合的とする」必要はなかった。
生成規則の定義だけで結合性を指定しなくても衝突は起きない。
>>963 構文解析とかガキのやることだよな。
その先を見ろよ。
おれのちんこなめろよ
構文解析は今もホットだぜ。
968 :
デフォルトの名無しさん:2009/01/24(土) 01:08:13
未だにオントロジーやってるのってEUの
外基地研究者ぐらいじゃねーの?
オントロジーなんて日本でもアメリカでも中国でもどこでもやってるぞい
阪大でやってたような
オントロジーいらないって言ってる輩は、
「いいもん、別にCだけで何でも作れるから今のままで苦労してないもん!」
みたいな事を平然と言ってのける人種だけ
「もっとOSとかネットとかグリッドとかやってみたいから何かいいのないかな」
っていってる奴は死んでいいけどオントロジーはおもしろいです
( ゚д゚)ポカーン
974 :
デフォルトの名無しさん:2009/01/25(日) 00:08:49
ちょっとした処理系を作ろうと思ってるんだけど、yacc勉強したほうがいい?
それとも、自前で実装するほうがいい?
ソースを公開したい場合は、
lex はライブラリを必要とするので
lex のインストールを相手に強要することになってしまう。
この点が問題にならないのであれば、yacc/lex というか、
今なら bison/flex あたりを勉強するのが楽だと思う。
> lex はライブラリを必要とするので
ええ?どの環境?
そもそもライブラリ無かろうが lex のソースをコンパイルするのに lex が要るんじゃないか?
lex が flexのエイリアスだったりすることをいってるじゃないか?
ソースを公開したい場合は、
〜 はコンパイラを必要とするので
〜 のインストールを相手に強要することになってしまう。
ユーザならともかくコンパイルする人間にそこまで気を使ってどうするよ
コンパイラ1つあればコンパイルできる、って方が楽だ
>それとも、自前で実装するほうがいい?
自前で実装すればコンパイラ1つあればコンパイルできるという状況になる。
そっちの方がいいと思うなら自前で実装した方が良い。
ソースを公開したい場合は、
ソースはダウンロードを必要とするので
ソースのダウンロードを相手に強要することになってしまう。
バイナリを公開したい場合は(以下略
>>978 libflのこと言ってるんだろうね。
BSDライセンスだから、一緒にソースを配布すればいいんだけど。
気づいたら980越えてるな。
テンプレ修正要求とかあったら出してちょ。
...電通大の(渡邊先生のところかな)compilers鯖が403のままだ。
検索したら最終講義という話題が2005年にあったようなので、
引退されたから鯖止めたのか、だとすると復帰はないかな。
あそこは研究室にグローバルIP振って各自管理だから、
引退されたなら、ゼミを引き継いだ教授ゼミのサーバにあるかも。
994 :
993:2009/01/26(月) 17:58:33
うぉ、
>>297までしか見えていない状態だったので、
超カメレスしてしまった。。
>>974 使っているうちに欲しい機能は増えていくから、
最初からパーサジェネレータを使った方がいいと思う。
再帰下降だと左再帰の扱いが面倒だし。
yaccやbisonは古臭くて扱いにくいので、他のも見てみては。
ソースコードのきれいさで言えば、個人的にはCaperが好み。
997 :
デフォルトの名無しさん:2009/01/27(火) 13:37:46
>>976 最近は違うのか?
flexをC++モードで使うとライブラリが必要ないのでオヌヌメだったりする....ってか
10年以上前の情報だけどね。
998 :
デフォルトの名無しさん:2009/01/27(火) 13:39:05
>>974 実装したい言語のタイプによるんじゃないかなぁ。Lispっぽければパーサジェネレータいらない。
999 :
デフォルトの名無しさん:2009/01/27(火) 13:40:40
>>972 オントロジーは面白いです、確かに。しかし、オントロジー研究者が約束した果実は
今までもたらされていないし、これからももたらされることはないでしょう。
1000 :
デフォルトの名無しさん:2009/01/27(火) 14:40:57
>>1000にあたり意見を述べさせていただきます。
次スレは必要ないと思います。
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。