
すいません
今Haskellの勉強をしていて Parsecという構文解析ライブラリを触っています
コンパイラというのを始めて作ってみて思ったのですが
Parsecでも四則演算やif文が動く状態まで作ってみて
LL文法でも結構なんでも解析出来ちゃう実感を感じてしまったのですが
yacc等で使われているLALR法で解析できるのにLL法で解析できない文法というのは
具体的にはどのような文法なのでしょうか?
特にどれでも良いので産業界で受け入れられているプログラミング言語の構文など出していただけると幸いです
No.2ベストアンサー
- 回答日時:
こんにちは
HaskellのPersecで検索したところ、↓の参考URLのブログ記事がみつかりました。
左再帰の話題がでていますね。
expr ::= expr '+' term | term の様な構文の場合
exprをパースする関数は、右辺の左端がexprであるので最初に自分自身が再帰的に呼ばれて無限再帰になってしまうということです。(Haskellはよく知らないので表現が的確か不安ですが)
ちなみに、同ブログ記事の中にBNFを変形して対応する方法が記載されていますが、これには演算子の結合方向が変化する違いが生じます。
a + b + c という式の場合
本来であれば、(a + b) + c と評価されるべきところが
変形BNFでは、a + (b + c)と評価されてしまうということです。
足し算の場合はどちらも計算結果は同じですが、引き算になると結果が変わってきますよね。
以上、ご参考にしていただければ幸いです。
参考URL:http://d.hatena.ne.jp/kazu-yamamoto/20110127/129 …
なんだか納得いきました
無限再帰は作っている最中、何度も出会っていたのですが構文解析というのはそれが当然と思ってしまっていました
実はこんな当たり前に回避できるものだったのですね
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
graph.hがincludeできない
-
io.hをincludeするとそのような...
-
C++ で、「)」が必要 というエ...
-
timeBeginPeriod()関数が使え...
-
volatile修飾について
-
コンパイラフラグ(compiler fla...
-
CとC++って何が違うのでしょうか?
-
バイナリファイルとソースコー...
-
変数(関数)名の頭に_
-
ABAQUS ユーザーサブルーチン...
-
Delphiの逆コンパイル
-
VBAで関数をつくる
-
銃を発砲するならともかく、日...
-
OS入ってる機器のソフト・アプ...
-
Excelで4096点以上のFFTの方法
-
65536は2の何乗なのでしょうか?
-
空elseの有無
-
PICマイコンのコピー(クローン...
-
TMBMSRV.exeによるCPU使用率上昇
-
Javaでのある数の小数点乗に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C++ で、「)」が必要 というエ...
-
C++でアボート(Abort)で処理が...
-
0除算して、落ちるプログラムと...
-
io.hをincludeするとそのような...
-
コンパイルできない
-
fortranでのNaNについて
-
Visual C++とVisual C++.NETの違い
-
Delphiの逆コンパイル
-
C言語のワーニングメッセージの...
-
プリコンパイラとは?
-
変数(関数)名の頭に_
-
volatile修飾について
-
「.c」拡張子でC++文法を使...
-
Eclipseの環境設定について
-
どのプログラミング言語ででき...
-
コンパイラについて
-
timeBeginPeriod()関数が使え...
-
isnanの取り扱いについて
-
ABAQUS ユーザーサブルーチン...
-
CPUが16bitでも32bitOSでコンパ...
おすすめ情報